674. 最长连续递增序列
✅做题思路or感想
暴力解法
“连续”,“递增”要素过多,一眼暴力
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
int result = 1, sum = 1;
for (int i = 1; i < nums.size(); i++) {
//递增,则当前记录 + 1
if (nums[i] > nums[i - 1]) {
sum++;
} else { //如果不递增了,则重置当前记录,更新最长长度的记录
result = max(result, sum);
sum = 1;
}
}
result = max(result, sum);
return result;
}
};
动态规划
dp数组含义
dp[i]
,以nums[i]
结尾的最长连续递增子序列的长度
推导公式
当 nums[i] > nums[j]
时: nums[i]
可以接在nums[j]
之后(此题要求严格递增),此情况下最长上升子序列长度为dp[j] + 1
;
if (nums[i] > nums[j]) {
dp[i] = dp[i - 1] + 1;
}
初始化
因为最少的子序列的长度为1,所以一律初始化为1就好了
遍历顺序
从小推大,所以是正序
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
vector<int>dp (nums.size(), 1);
//result来记录最大的长度
int result = 1;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] > nums[i - 1]) {
dp[i] = dp[i - 1] + 1;
result = max(result, dp[i]);
}
}
return result;
}
};