【hot100-动态规划-300.最长递增子序列】
力扣300.最长递增子序列思路解析
本题要求在一个整数数组 nums
中,找到最长严格递增子序列的长度。子序列是指从原数组中派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是数组 [0,3,1,6,2,2,7]
的子序列。
动态规划思路
- 定义状态:
- 定义一个数组
dp
,其中dp[i]
表示以nums[i]
结尾的最长递增子序列的长度。因为每个元素本身至少可以构成一个长度为 1 的递增子序列,所以dp
数组的初始值都为 1。
- 定义一个数组
- 状态转移方程:
- 对于每个位置
i
,需要遍历它之前的所有元素nums[j]
(j < i
)。如果nums[i] > nums[j]
,说明nums[i]
可以接在nums[j]
后面构成一个更长的递增子序列,此时dp[i]
可以更新为dp[j] + 1
和当前dp[i]
中的较大值,即dp[i] = Math.max(dp[i], dp[j] + 1)
。
- 对于每个位置
- 最终结果:
- 遍历完整个数组后,
dp
数组中的最大值即为最长递增子序列的长度。
- 遍历完整个数组后,
复杂度分析
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)