300. 最长递增子序列
思路与方法
定义\(dp[i]\)为考虑前i个元素,以第i个元素为结尾的最长上升子序列的长度。nums[i]必须包含
我们从小到大计算\(dp\)数组的值。在计算\(dp[i]\)之前,
假设我们已经计算出了\(dp[0 \dots i-1]\)的值,则状态转移方程为:
\(dp[i] = max(dp[j]) + 1\), 其中\(0 \leq j \le i-1\) 且\(nums[i] > nums[j]\)
最后,整个数组的最长上升子序列即为所有\(dp[i]\)中的最大值:
\(LISlen = max(dp[i])\)
代码如下:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int ans = 0;
int len = nums.size();
vector<int> dp(len); //dp数组的含义:以nums[i]为结尾的最长上升子序列的长度 nums[i]必须包括
for(int i=0;i<len;i++){
dp[i] = 1; //初始化
//然后考虑之前已知的数据
for(int j=0;j<i;j++){
if(nums[i] > nums[j]){//严格递增
dp[i] = max(dp[i],dp[j]+1); //挑选出来最大的那个 4+1 5+1 1+1
}
}
ans = max(ans,dp[i]);
}
return ans;
}
};
复杂度分析
- 时间复杂度:\(O(n^{2})\).
- 空间复杂度:\(O(n)\).