校园二手物品交易网站怎么做,wordpress 显示备案,广州市天气,四川成都房产网文档讲解#xff1a;代码随想录 视频讲解#xff1a;代码随想录B站账号 状态#xff1a;看了视频题解和文章解析后做出来了 300.最长递增子序列 class Solution: # 2516 ms, faster than 64.96%def lengthOfLIS(self, nums: List[int]) - int:n len(nums)dp [1] * n… 文档讲解代码随想录 视频讲解代码随想录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到i1之间最长的自增序列的长度。
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. 举例