leetcode刷题之动态规划法NO.3
1.题目
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。
例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.解法一
2.1.思路
-
明确题意:
- 子串一定是连续的,而子序列不一定是连续的。
- 使用例子来明确题意。
-
定义状态dp(i):dp(i)是以nums[i]结尾的最大递增子序列的长度。
-
写出状态方程(考虑dp(i)从哪里来或者是到哪里去):如下图1所示,根据归纳法可以写出状态方程为
dp[i]=max(dp[j])+1,其中0≤j<i且num[j]<num[i]。
![图2.1]()
2.2.实现
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size()+1, 1);
for (int i=0; i<nums.size(); i++) {
for (int j = 0; j<i; j++) {
if (nums[i] > nums[j]) {
dp[i] = max(dp[i], dp[j]+1);
}
}
}
int res = 0;
for (int i=0; i<dp.size(); i++) {
res = max(res, dp[i]);
}
return res;
}
};
2.3.算法分析
- 时间复杂度为O(n^2)
- 空间复杂度为O(n)
3.解法二
4.总结
- 对算法库中常用函数的使用。
本文来自博客园,作者:曼路的个人博客,转载请注明原文链接:https://www.cnblogs.com/manlujun/articles/15617136.html


浙公网安备 33010602011771号