代码随想录算法训练营第五十二天|300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

文档讲解:代码随想录

视频讲解:代码随想录B站账号

状态:看了视频题解和文章解析后做出来了

300.最长递增子序列 

class Solution:  # 2516 ms, faster than 64.96%def lengthOfLIS(self, nums: List[int]) -> int:n = len(nums)dp = [1] * nfor i in range(1, n):for j in range(i):if nums[i] > nums[j]:dp[i] = max(dp[j] + 1, dp[i])return max(dp)
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)

1. 确定dp数组的含义

dp[i] 为下标范围为0到i+1之间,最长的自增序列的长度。

2. 确定递推公式

因为本题规定了自增序列可以不连续,所以我们不能只和前一个元素对比,而是和所有前面的元素对比,如果大于前面的某个元素,就在那个元素的基础上+1,当然我们要一直保留最大值。

所以dp[i] = max(dp[j] + 1, dp[i])

其中i是当前元素,j是i之前的某个元素。

3. dp数组初始化

因为我们要返回的是长度,而每个元素单独长度已经为1了,所以所有元素都先初始化为1。

4. 确定遍历顺序

递推公式中的j是i之前的元素下标,所以从前往后递推。

5. 举例

674. 最长连续递增序列

class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:n = len(nums)dp = [1] * nfor i in range(1, n):if nums[i] > nums[i-1]:dp[i] = dp[i-1] + 1return max(dp)
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

上一道题的简化版,不太清楚为什么卡哥为什么设置先做上道题再做这道题。

唯一区别是这次要求的是连续数组,但其实这个条件简化了遍历和递推公式,因为我们不用再使用双循环遍历当前元素之前的所有元素,而是只对比前一个就可以了。

所以这道题只需要一个循环,每个当前元素 i 只需和 i-1 对比即可。

718. 最长重复子数组 

class Solution:def findLength(self, nums1: List[int], nums2: List[int]) -> int:dp = [[0] * (len(nums2) + 1) for _ in range(len(nums1) + 1)]res = 0for 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] + 1res = max(res, dp[i][j])return res
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n^2)

1. 确定dp数组的含义

dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。

2. 确定递推公式

根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。

即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;

3. dp数组初始化

但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;

所以dp[i][0] 和dp[0][j]初始化为0。

4. 确定遍历顺序

外层for循环遍历A,内层for循环遍历B,反过来也可以。

同时题目要求长度最长的子数组的长度。所以在遍历的时候顺便把dp[i][j]的最大值记录下来。

5. 举例

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

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

相关文章

Samsung下origen中uboot的配置与编译

uboot的特点: n代码结构清晰 n 支持丰富的处理器与开发板,易于移植 n 支持丰富的用户命令 n 支持丰富的网络协议 n 支持丰富的文件系统 n 支持丰富的设备驱动 n 更新活跃、用户较多、资料丰富 n 开放源代码 n 较高的稳定性 n 不具有通用性(不…

基于51单片机数字电流表数码管显示( proteus仿真+程序+设计报告+讲解视频)

电流表 1. 主要功能:2. 讲解视频:3. 仿真4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接: 基于51单片机数字电流表数码管显示( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器…

【机器学习 | ARIMA】经典时间序列模型ARIMA定阶最佳实践,确定不来看看?

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

SWOT是什么意思?SWOT分析必备的10款软件,别说你还不知道!

在今天快速变化的商业环境中,保持竞争优势并做出明智的决策至关重要。无论你是经验丰富的高管、企业家还是专注的团队领导者,战略思维都是必不可少的。在这个过程中的一个重要工具是SWOT分析软件。 正确的SWOT分析工具可以决定商业战略是否能够创造有意…

UE 进阶篇一:动画系统

导语: 下面的动画部分功能比较全,可以参考这种实现方式,根据自己项目的颗粒度选择部分功能参考,我们商业项目动画部分也是这么实现的。 最后实现的效果如下: 最终效果 目录: ---------------------------…

如何在AD上创建完整的项目

首先,我们先安装好AD,这里我使用的是AD22,安装过程如下: Altium Designer 22下载安装教程-CSDN博客 Altium Designer 22是全球领先的PCB设计软件之一,为电路板设计师提供了一种集成的解决方案,旨在简化和加…

2023年最新PyCharm环境搭建教程(含Python下载安装)

文章目录 写在前面PythonPython简介Python生态圈Python下载安装 PyCharmPyCharm简介PyCharm下载安装PyCharm环境搭建 写在后面 写在前面 最近博主收到了好多小伙伴的吐槽称不会下载安装python,博主听到后非常的扎心,经过博主几天的熬夜加班,…

Web 自动化神器 TestCafe(三)—用例编写篇

一、用例编写基本规范 1、 fixture 测试夹具 使用 TestCafe 编写测试用例,必须要先使用 fixture 声明一个测试夹具,然后在这个测试夹具下编写测试用例,在一个编写测试用例的 js 或 ts 文件中,可以声明多个测试夹具 fixture(测试…

Nginx模块开发之http handler实现流量统计(1)

文章目录 一、handler简介二、Nginx handler模块开发2.1、示例代码2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 三、Nginx的热更新总结 一、handler简介 Handler模块就是接受来自客户端的请求并产生输出的模块。 配置文件中使用location指令…

multiset和multimap(map和set的可重复版)

multiset和multimap multisetmultiset的使用 multimapmultimap的使用 这里有讲解map和set的详细使用: C中的map和set使用详解 multiset multiset的文档介绍 翻译: multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。在multiset…

java--权限修饰符

1.什么是权限修饰符 就是是用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围。 2.权限修饰符有几种&#xff1f;各自的作用是什么&#xff1f; private<缺省<protected<public(范围由小到大)

【小黑嵌入式系统第六课】嵌入式系统软件设计基础——C语言简述、程序涉及规范、多任务程序设计、状态机建模(FSM)、模块化设计、事件触发、时间触发

上一课&#xff1a; 【小黑嵌入式系统第五课】嵌入式系统开发流程——开发工具、交叉开发环境、开发过程(生成&调试&测试)、发展趋势 下一课&#xff1a; 【小黑嵌入式系统第七课】PSoC 5LP 开发套件&#xff08;CY8CKIT-050B &#xff09;——PSoC 5LP主芯片、I/O系统…