研习代码 day45 | 动态规划——子序列问题

一、最长递增子序列

        1.1 题目

        给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

        子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

  • 1 <= nums.length <= 2500
  • -10^4 <= nums[i] <= 10^4

进阶:

  • 你能将算法的时间复杂度降低到 O(n log(n)) 吗?

        1.2 题目链接

        300.最长递增子序列

        1.3 解题思路和过程想法

        (1)解题思路

        # 分析:当前状态受前一状态影响,且遵守类似规则的求解问题,动态规划问题
                      因为该子序列不一定是连续的,但需判断其与当前元素的关系,所以使用两层循环
                      因为只是判断相等关系,可能存在多次相同匹配,在过程中用result记录区间最大值

        # 数组:截至到 i 的最长严格递增子序列的长度 dp[i]

        # 递推关系:因为存在一个累计过程,如果满足当前元素递增 dp[i] = max(dp[i], dp[j]+1)

        # 初始化:每个元素位置的初始递增长度都是 1

        (2)过程想法

        有框架之后,代码很好写

        1.4 代码

class Solution:def lengthOfLIS(self, nums: List[int]) -> int:# 分析:当前状态受前一状态影响,且遵守类似规则的求解问题,动态规划问题# 数组:截至到 i 的最长严格递增子序列的长度 dp[i]# 递推关系:如果满足当前元素递增 dp[i] = max(dp[i], dp[i-1]+1)# 初始化:每个元素位置的初始递增长度都是 1 length = len(nums)dp = [1] * lengthresult = 1                      for i in range(1, length):      # 遍历当前节点的判断for j in range(0, i):       # 遍历当前节点之前的所有结点if nums[i] > nums[j]:dp[i] = max(dp[i], dp[j]+1)result = max(result, dp[i])return result

二、最长连续递增子序列

        2.1 题目

        给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

        连续递增的子序列 可以由两个下标 l 和 rl < r)确定,如果对于每个 l <= i < r,都        有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。 

示例 2:

输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。

提示:

  • 1 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9

        2.2 题目链接

        674.最长连续递增序列

        2.3 解题思路和过程想法

        (1)解题思路

        # 分析:当前状态受前一状态影响,且遵守类似规则的求解问题,动态规划问题
                      因为该子序列是连续的,用一层循环处理即可
                      因为只是判断相等关系,可能存在多次相同匹配,在过程中用result记录区间最大值

        # 数组:截至到 i 的最长严格递增子序列的长度 dp[i]

        # 递推关系:如果满足当前元素递增 dp[i] = dp[j]+1

        # 初始化:每个元素位置的初始递增长度都是 1

        (2)过程想法

        思路很好想,代码也很好写

        2.4 代码

class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:# 分析:当前状态受前一状态影响,且遵守类似规则的求解问题,动态规划问题# 截至到 i 的最长连续递增子序列的长度 cur# 递推关系:如果满足当前元素递增 cur = cur+1# 初始化:每个元素位置的初始递增长度都是 1 length = len(nums)# 利用其迭代过程,节省存储空间cur = 1result = 1for i in range(1, length):if nums[i] > nums[i-1]:cur = cur+1result = max(result, cur)else:cur = 1return result

三、最长重复子数组

        3.1 题目

        给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 

示例 1:

输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。

示例 2:

输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
输出:5

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 100

        3.2 题目链接

        718.最长重复子数组

        3.3 解题思路和过程想法

        (1)解题思路

        # 分析:存在需比较的两个数组,如果使用暴力法,其实是需要三层for循环的,根据数据的量级,是会提示超时的;当前状态受前一状态影响,且遵守类似规则的求解问题,动态规划问题。但需标记两个数组的结束指针,所以考虑使用二维DP数组。
         因为只是判断相等关系,可能存在多次相同匹配,在过程中用result记录区间最大值

        # 数组:nums1 截至到 i , nums2 截至到 j 的最长重复子序列的长度 dp[i][j]

        # 递推关系:如果当前元素满足要求 dp[i][j] = dp[i-1][j-1]+1

        # 初始化:每个元素位置的初始递增长度都是 0,但因为使用的判断条件是 nums1[i-1] 和 nums2[j-1],所以需先初始化第一行与第一列。

        注:也可以使用一维滚动数组的思想,思路是类同的。

        (2)过程想法

       需要想到使用二维数组,后续的代码是好写的。

        3.4 代码

        3.4.1 二维动态数组
class Solution:def findLength(self, nums1: List[int], nums2: List[int]) -> int:# 分析:当前状态受前一状态影响,且遵守类似规则的求解问题,动态规划问题# nums1 截至到 i , nums2 截至到 j 的最长重复子序列的长度 dp[i][j]# 递推关系:如果当前元素满足要求 dp[i][j] = dp[i-1][j-1]+1# 初始化:每个元素位置的初始递增长度都是 0dp = [[0] * (len(nums2)+1) for _ in range(len(nums1)+1)]# 对第一行和第一列进行初始化for i in range(len(nums1)):if nums1[i] == nums2[0]:dp[i + 1][1] = 1for j in range(len(nums2)):if nums1[0] == nums2[j]:dp[1][j + 1] = 1result = 0# 此处用的是 i-1 与 j-1 相比较,其实用 i 和 j 比较也可以,但是因为下标的原因,前者更简单for i in range(1, len(nums1)+1):for j in range(1, len(nums2)+1):       if nums1[i-1] == nums2[j-1]: dp[i][j] = dp[i-1][j-1]+1result = max(result, dp[i][j])return result
        3.4.2 一维滚动数组 
class Solution:def findLength(self, nums1: List[int], nums2: List[int]) -> int:# 分析:当前状态受前一状态影响,且遵守类似规则的求解问题,动态规划问题# nums1 截至到 i , nums2 截至到 j 的最长重复子序列的长度 dp[i][j]# 递推关系:如果当前元素满足要求 dp[i][j] = dp[i-1][j-1]+1# 初始化:为减少空间复杂度,采用一维滚动数组的思想存储过程变量。# 每个元素位置的初始递增长度都是 0dp = [0] * (len(nums2) + 1)result = 0# 此处用的是 i-1 与 j-1 相比较,其实用 i 和 j 比较也可以,但是因为下标的原因,前者更简单for i in range(1, len(nums1) + 1):pre = 0for j in range(1, len(nums2) + 1):cur = dp[j]if nums1[i - 1] == nums2[j - 1]:    # 如果找到相应的元素,则更迭dp数组dp[j] = pre + 1          result = max(dp[j], result)else:                               # 否则,结束更迭,重置dp数组dp[j] = 0pre = curreturn result

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python代码打包成.so的方法

前提条件&#xff1a; 确保电脑已经安装gcc且终端能检索到确保Python中已经安装cython包&#xff0c;若未安装&#xff0c;则先使用pip install cython进行安装 打包方法&#xff1a; step1&#xff1a;编写编译脚本setup.py&#xff0c;代码如下&#xff1a; # encoding ut…

生成对抗网络(DCGAN)手写数字生成

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09; 二、什么是生成对抗网络1. 简单介绍2. 应用领域 三、创建模型1. 生成器2. 判别器 四、定义损失函数和优化器1. 判别器损失2. 生成器损失 五、定义训练循环六、训练模型七、创建 G…

“前端八股文背诵版“,终于整理完了,堪称最强!

随着互联网的快速发展&#xff0c;前端开发领域成为了IT行业中的热门领域之一。很多求职者都希望能够进入这个领域&#xff0c;但是面对着如此激烈的竞争&#xff0c;很多人都感到无从下手。为了帮助大家更好地掌握前端开发的相关知识&#xff0c;小编整理了一份前端面试题合集…

单片机怎么实现真正的多线程?

单片机怎么实现真正的多线程? 不考虑多核情况时&#xff0c;CPU在一个时间点只能做一件事&#xff0c;因为切换的速度快所以看起来好像是同时执行多个线程而已。 实际上就是用定时器来做时基&#xff0c;以时间片的方式分别执行来实现的&#xff0c;只不过实现起来细节比较复…

网络安全应急响应-Server2228(环境+解析)

网络安全应急响应 任务环境说明: 服务器场景:Server2228(开放链接)用户名:root,密码:p@ssw0rd123

【代码】考虑差异性充电模式的电动汽车充放电优化调度matlab-yalmip-cplex/gurobi

程序名称&#xff1a;考虑差异性充电模式的电动汽车充放电优化调度 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;提出了一种微电网中电动汽车的协调充电调度方法&#xff0c;以将负荷需求从高峰期转移到低谷期。在所提出的方法中&#xff0c;基于充…

RHEL8.9 静默安装Oracle19C

RHEL8.9 静默安装Oracle19C 甘肃圆角网络科技开发有限公司 说明(GUI)&#xff1a;  1.实际业务场景中&#xff0c;Linux环境一般情况下是没有GUI的。没有GUI并不意味着没有安装图形界面。可能在部署Linux操作系统环境的时候安装了桌面环境&#xff0c;只是启动的时候设置了启动…

英国人工智能初创公司Stability AI面临卖身压力;深度学习中的检索增强生成简介

&#x1f989; AI新闻 &#x1f680; 英国人工智能初创公司Stability AI面临卖身压力 摘要&#xff1a;多位知情人士透露&#xff0c;英国人工智能初创公司Stability AI正寻求出售公司&#xff0c;因为投资者对其财务状况的压力越来越大。管理层最近几周一直将自己标榜为收购…

MapInfo Pro错误提示:This operation requires elevated privileges……

尝试删除MapInfo Pro时出现错误“此操作需要提升权限。将产品DVD/CD插入媒体播放器并双击setup.exe文件重新启动。此安装程序现在将中止。”。 原因&#xff1a; 这可能是由于权限问题。 解决方式&#xff1a; 1.如果MapInfo Pro setup.exe可用&#xff0c;请执行以下步骤&…

笔记64:Bahdanau 注意力

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a

FIORI /N/UI2/FLP 始终在IE浏览器中打开 无法在缺省浏览器中打开

在使用/N/UI2/FLP 打开fiori 启动面板的时候&#xff0c;总是会在IE浏览器中打开&#xff0c;无法在缺省浏览器打开 并且URL中包含myssocntl 无法正常打开 启动面板 这种情况可以取消激活ICF节点/sap/public/myssocntl

java中@Async注解在CompletableFuture.runAsync里面使用没有生效的原因?

在Java中&#xff0c;Async注解通常与Spring框架一起使用以实现异步方法调用。然而&#xff0c;CompletableFuture.runAsync()是Java标准库中的方法&#xff0c;并不受Async注解的影响。 Async注解只能被Spring容器识别和处理&#xff0c;因此只能在由Spring管理的组件&#x…

spring boot 3.2.0 idea从零开始

spring boot 3.2.0 idea从零开始 最新的spring initilizer 不再支持低版本java&#xff0c;只能选择17、21 。 我也被迫尝试下最新版本的java。 jdk下载地址 自定义好artifact和group之后点击下一步。 在这里选择需要的组件&#xff0c;我准备做web项目所以只选择spring web …

word模板导出word文件

前期准备工作word模板 右键字段如果无编辑域 ctrlF9 一下&#xff0c;然后再右键 wps 直接 ctrlF9 会变成编辑域 pom.xml所需依赖 <dependencies> <!--word 依赖--> <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId…

vim工具以及如何给用户加上sudo的权限

Linux开发工具之vim以及如何给用户配置sudo的权限文件的操作 1.vim概念的介绍 2.vim的多模式的介绍 3.vim的命令模式与低行模式的相关指令操作 4.vim如何配置 5.如何给普通用户配置sudo的权限 本文开始~~~~ 1. vim概念的介绍 vim是一款多模式的文本编辑器&#xff0c;简单…

C语言-指针讲解(4)

在上一篇博客中&#xff1a; C语言-指针讲解(3) 我们给大家介绍了指针进阶的用法 让下面我们来回顾一下讲了什么吧&#xff1a; 1.字符指针变量类型以及用法 2.数组指针本质上是一个指针&#xff0c;里面存放数组的地址。而指针数组本质上是个数组&#xff0c;里面存放的是指针…

iOS系统上待办事项提醒软件哪个好

在这个快节奏的生活中&#xff0c;各种待办事项充斥了我们的日常工作和生活&#xff0c;尤其对于像我这样的iPhone用户而言&#xff0c;一款能够在iOS系统上快速和准确记录和提醒待办事项的软件&#xff0c;显得至关重要。 正如前几天&#xff0c;我正沉浸在工作中的时突然被领…

将ipynb文件转为py的两种方法

解决方案&#xff1a; 方法一&#xff1a;jupyter notebook打开后另存为.py文件&#xff08;方便快捷&#xff09; 用jupyter notebook打开后&#xff0c;选左上角 File &#xff0c; Download as &#xff0c;选择 Python(.py) 即可保存为.py格式的文件 方法二&#xff1a;…

Python|OpenCV-性能测试以及优化方法(9)

前言 本文是该专栏的第9篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在面对图像处理的项目需求时,要知道程序每秒都会处理大量的数据工作,而我们想要让程序达到实用的效果。必须要让自己的代码能提供最准确的解决方法,且该方法能以最快的效率去执行完成。所…

【算法】Rabin-Karp 算法

目录 1.概述2.代码实现3.应用 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 有关字符串模式匹配的其它算法&#xff1a; 【算法】Brute-Force 算法 【算法】KMP 算法 1.概述 &#xff08;1&#xff09;Rabin-Karp 算法是由 Richard M. Karp 和 Michael O. R…