力扣题目:#300.最长递增子序列
刷题时长:参考题解后5min
解题方法:动态规划
复杂度分析
- 时间复杂度: O(n^2)
- 空间复杂度: O(n)
问题总结
- 难点在于如何定义dp[i],由哪些状态可以推出来,并取最大值
本题收获
- 动规思路
- 确定dp数组及下标的含义:dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
- 确定递推公式: if nums[i] > nums[j]: dp[i] = max(dp[i], dp[j] + 1)
- dp数组的初始化:dp[i] =1
- 确定遍历顺序:正序
力扣题目:#674. 最长连续递增序列
刷题时长:参考题解后2min
解题方法:动态规划
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
问题总结
- 区别于上题,此题要求连续
本题收获
- 动规思路
- 确定dp数组及下标的含义:以下标i为结尾的连续递增的子序列长度为dp[i]
- 确定递推公式:if nums[i] > nums[i - 1]: dp[i] = dp[i - 1] + 1
- dp数组的初始化:dp[0] = 1
- 确定遍历顺序:正序
力扣题目:#718. 最长重复子数组
刷题时长:参考题解后8min
解题方法:动态规划
复杂度分析
- 时间复杂度:O(n × m),n 为A长度,m为B长度
- 空间复杂度:O(m)
问题总结
- 难点在如何巧妙定义dp[i][j],遍历dp[i][j]的时候i 和 j都要从1开始
- 写码问题出在二维行列数与for循环的对应
- 边界值
本题收获
- 动规思路
- 确定dp数组及下标的含义:dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]
- 确定递推公式:if A[i - 1] = B[j - 1]: dp[i][j] = dp[i - 1][j - 1] + 1
- dp数组的初始化:dp[i][0] 和dp[0][j]没有意义,初始化为0
- 确定遍历顺序:正序