474 字
2 分钟
674. 最长连续递增序列

674. 最长连续递增序列#

题目描述#

给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。

连续递增的子序列可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1],那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5],长度为 3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

示例 2:

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

提示:

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

解题思路#

核心思想#

用分组循环把数组按「严格递增」分段:段内满足 nums[j+1] > nums[j]。找到递增段起点 i,内层 j 向后扩展直到递增中断,段长度更新答案,i = j + 1。

分组示意(nums = [1,3,5,4,7]):

[1,3,5] | [4,7]
3 2 → 最大 3

算法步骤#

  1. 初始化 ans = 0,i = 0。
  2. 当 i < n 时:
    • j = i,内层 while j+1 < n and nums[j+1] > nums[j] 时 j++;
    • ans = max(ans, j - i + 1),i = j + 1。
  3. 返回 ans。

逐步举例#

以 nums = [1,3,5,4,7] 为例:

段区间长度
1,3,5[0,2]3
4,7[3,4]2

最大为 3。注意 3→5 递增、5→4 中断,故两段分开。

复杂度分析#

  • 时间复杂度:O(N),单次线性扫描。
  • 空间复杂度:O(1)。

代码实现#

{{% highlight python %}}

from typing import List
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
n = len(nums)
ans = 0
i = 0
while i < n:
j = i
while j + 1 < n and nums[j + 1] > nums[j]:
j += 1
ans = max(ans, j - i + 1)
i = j + 1
return ans
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent))
import unittest
from solution import Solution
class TestSolution(unittest.TestCase):
def test_example1(self):
self.assertEqual(Solution().findLengthOfLCIS([1, 3, 5, 4, 7]), 3)
def test_example2(self):
self.assertEqual(Solution().findLengthOfLCIS([2, 2, 2, 2, 2]), 1)
if __name__ == '__main__':
unittest.main()

{{% /highlight %}}

674. 最长连续递增序列
https://h1s97x.github.io/posts/coding/coding-674-longest-continuous-increasing-subsequence/
作者
H1S97X
发布于
2026-08-23
许可协议
CC BY-NC-SA 4.0
随机文章