在问 · 算法题解

674. 最长连续递增序列

题目描述

输入一个整数数组 nums,数组未排序。

在数组中找一段连续的元素 nums[l..r],要求其中每个元素都严格小于它后面紧挨着的那个,即对所有 l <= i < r 有 nums[i] < nums[i + 1]。

返回这种连续严格递增片段的最大长度。单个元素也算一段,长度为 1。

示例 1
输入:nums = [1,3,5,4,7]
输出:3

解释:[1,3,5] 长度为 3;[1,3,5,7] 虽然递增但在原数组中不连续。

示例 2
输入:nums = [2,2,2,2,2]
输出:1

解释:相邻元素都相等,最长只能取一个元素。

数据范围

  • 1 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9

解题思路

一次扫描。cur 表示以 nums[i] 结尾的连续递增段长度:若 nums[i] > nums[i-1],这一段延长,cur += 1;否则从 nums[i] 重新开始,cur = 1。每次延长后用 cur 更新答案 best。

为什么正确

处理完下标 i 后,cur 等于以 i 结尾的最长连续严格递增段长度,best 等于 nums[0..i] 中的答案。

复杂度分析

时间 O(n),空间 O(1)。

易错点

要求严格递增,相等的相邻元素也会断开(用 > 而不是 >=);best 初值为 1,因为单个元素本身就是长度 1 的递增序列。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        best = cur = 1
        for i in range(1, len(nums)):
            if nums[i] > nums[i - 1]:
                cur += 1
                best = max(best, cur)
            else:
                cur = 1
        return best

载入编辑器,自己跑一遍 →

数组与矩阵 专题的其他题目

查看 数组与矩阵 全部题目 →