一、最长递增子序列(非连续)
300. 最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
1、dp数组
dp[i]为以元素nums[i]结尾的最长递增子序列。
2、递推公式
位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。
for(int j = i - 1; j >= 0; j--){
if(nums[i] > nums[j]){
dp[i] = max(dp[i], dp[j] + 1); //找到i前面最长的子序列
}
3、初始化
每一个i,对应的dp[i](即最长上升子序列)起始大小至少都是是1.
4、遍历顺序
从前到后
5、返回值
dp[i]记录的仅仅是以nums[i]结尾的子序列的最大值,但并不知道这些序列中到底哪个最大,因此需要比较全部的dp[i],返回其中最大的
代码实现
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size() <= 1) return nums.size(); //特殊处理
vector<int> dp(nums.size(), 1); //dp数组初始化为1,
int maxLen = 0;
for(int i = 1; i < nums.size(); i++){
for(int j = i - 1; j >= 0; j--){
if(nums[i] > nums[j]){
dp[i] = max(dp[i], dp[j] + 1);
}
}
maxLen = max(maxLen, dp[i]); //选取最大的dp[i]返回
}
return maxLen;
}
};
二、最长连续递增子序列(连续)
674. 最长连续递增序列
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。