Skip to content

题目描述

给定整数数组 nums,找到最长严格递增子序列的长度。

解题思路

维护一个 tails 数组,tails[i] 表示长度为 i+1 的递增子序列的最小末尾元素。对每个元素,二分查找其在 tails 中的位置并替换。

tails 数组始终保持递增。bisect_left 找到第一个 ≥ num 的位置替换,这样可以保证 tails 尽可能小,为后续元素留出更多空间。注意 tails 不一定是真实的最长子序列,但长度是正确的。

代码实现

python
import bisect

class Solution:
    def lengthOfLIS(self, nums: list[int]) -> int:
        tails = []
        for num in nums:
            pos = bisect.bisect_left(tails, num)
            if pos == len(tails):
                tails.append(num)
            else:
                tails[pos] = num
        return len(tails)

复杂度分析

  • 时间复杂度: O(n log n)
  • 空间复杂度: O(n)

关键要点

  • 贪心 + 二分,维护 tails 数组记录递增子序列最小末尾。

基于 VitePress 构建