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算法步骤
- 初始化
ans = 0,i = 0。 - 当
i < n时:j = i,内层while j+1 < n and nums[j+1] > nums[j]时j++;ans = max(ans, j - i + 1),i = j + 1。
- 返回
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 ansimport sysfrom 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/