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)