LC 速查

HOT 100索引 › B15 动态规划 Dynamic Programming

LC 300最长递增子序列Longest Increasing Subsequence 中等

求整数数组中最长严格递增子序列的长度(不要求连续)。

思路 贪心+二分:tails[k] 存长度 k+1 的 LIS 最小结尾,二分找第一个 ≥ x 的位置替换或追加。时间 O(n log n)。

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        tails = []
        for x in nums:
            lo, hi = 0, len(tails)
            while lo < hi:
                mid = (lo + hi) // 2
                if tails[mid] < x:
                    lo = mid + 1
                else:
                    hi = mid
            if lo == len(tails):
                tails.append(x)
            else:
                tails[lo] = x
        return len(tails)
← 上一题 单词拆分乘积最大子数组 下一题 →