674. Longest Continuous Increasing Subsequence
设f[i]
为:以a[i]
结尾的最长连续上升子序列的长度。因为子序列是“最长无重复子序列”,所以以a[i]
结尾的最长连续上升子序列的倒数第二个元素必然是a[i - 1]
,否则就违背了**“连续”**。既然以a[i]
结尾的最长连续上升子序列是**最长**的,那么如果它被减去a[i]
这个元素的长度,必然是第二长的。
所以长度f[i]
可以被分解为两部分(其中一部分是规模更小的有相同结构的子问题):
a[i]
这个元素本身的长度- 以
a[i - 1]
结尾的最长连续子序列的长度
状态转移方程:
f[i] = max{ f[i - 1] + 1 }
(如果a[i - 1] < a[i]
)f[i] = 1
(如果a[i - 1] >= a[i]
),因为只有符合这种条件的i
才是连续上升子序列的起点
初始条件:f[0] = 1
class Solution {
public int findLengthOfLCIS(int[] nums) {
if (nums.length() <= 1) {
return nums.length();
}
int f[] = new int[nums.length()];
f[0] = 1;
int largest = f[0];
for (int i = 1; i < nums.length(); i++) {
if (nums[i - 1] < nums[i]) {
f[i] = f[i - 1] + 1;
} else {
f[i] = 1;
}
largest = Math.max(largest, f[i]);
}
return largest;
}
}