300. 最长递增子序列-最长上升子序列

Problem: 300. 最长递增子序列

41.最长上升子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

所以这道题目是求:严格递增子序列的长度

示例 1:

输入: nums = [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长递增子序列是[2,3,7,101],因此长度为 4 。

题解

dp数组含义

dp[i] 表示以nums[i]结尾的最长递增子序列

注意是以nums[i]结尾,并不是nums[0...i]的最长递增子序列,这两者区别非常大

初始化

初始化为1 因为最小的递增序列就是num[i]本身

递推公式

如果当前数(cur)大于之前的某个数(pre) 那么他们可以构成递增子序列

但是可能当前的数(cur)比之前很多数都大(pres)

因为本题要求最长的递增子序列

所以我们也就去找pres中递增子序列最大的那个也就是对应的dp[pre]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size(),1);
int res=0;
for(int i=0;i<nums.size();i++) {
int maxLength=0;
for(int j=i-1;j>=0;j--) if(nums[i]>nums[j])maxLength=max(dp[j],maxLength);
dp[i]+=maxLength;
res=max(res,dp[i]);
}
return res;
}
};