题目内容
给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。
优质解法思路
思路:
需要套用DP的四步:
- 确定状态:往往直接推导是不能靠因果推出状态应该设定成什么的,需要直接去设定。题目要求的是最长递增子序列的长度,根据拆解我们知道:最长递增子序列长度 = 最长递增子序列后退一位长度 + 1,所以说
f[i]
我们应该解释成:以a[i]
结尾的连续递增子序列长度 - 转移方程式:
f[i] = max{1, f[i] + 1|a[i-1] < a[i]}
- 初始条件:
f[0] = 1
,因为以a[0]
为结尾的字符串序列长度为1 - 顺序:从前至后
代码:
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
int res = 0;
int f = 0;
for(int i = 0; i < nums.size(); i++) {
if(i == 0)
f = 1;
else {
if(nums[i-1] < nums[i])
f++;
else {
if(res < f)
res = f;
f = 1;
}
}
}
if(res < f)
res = f;
return res;
}
};