674. 最长连续递增序列(Longest Continuous Increasing Subsequence)

频次 ★★★ · 难度 🟢 · 高频:字节

题目

未排序数组,找最长连续递增子序列(必须连续)的长度。

示例

输入: nums = [1,3,5,4,7]
输出: 3  ([1,3,5])

思路

贪心/DP:一次遍历,dp[i] = nums[i] > nums[i-1] ? dp[i-1] + 1 : 1

可优化到 O(1) 空间:用一个变量记录当前连续递增长度,一个变量记录全局最大值。

与 300. LIS(最长递增子序列)的区别:这道题要求连续,300 不要求连续。

代码

public int findLengthOfLCIS(int[] nums) {
    if (nums.length == 0) return 0;
    int cur = 1, max = 1;
    for (int i = 1; i < nums.length; i++) {
        if (nums[i] > nums[i - 1]) {
            cur++;
            max = Math.max(max, cur);
        } else {
            cur = 1;                         // 重置
        }
    }
    return max;
}

复杂度

  • 时间:O(n)
  • 空间:O(1)

边界条件

  • 空数组:返回 0
  • 单元素:返回 1
  • 全降序:每步都重置,max = 1

变式

易错点

  • 跟 300 题的区别:这道题是连续的(LCIS),300 是不连续的(LIS)。看到”连续”就用贪心,看到”不连续”就用 DP
  • 重置时 cur = 1(当前元素本身算一个),不是 0

面试追问

  • 如果要求不连续呢? 就是 300. LIS,O(n²) DP 或 O(n log n) 贪心 + 二分
  • 连续递增子数组 vs 连续递增子序列? 这道题就是连续递增子数组(subarray),但 LeetCode 标题叫”子序列”,注意区分

关联题