最长递增子序列(LIS):求数组中最长严格递增子序列长度。
法一 DP:dp[i] = 以 nums[i] 结尾的 LIS 长度,O(n^2)。
法二 贪心 + 二分(最优):维护「tails」数组存各长度递增子序列的最小结尾,用二分插入。
function lengthOfLIS(nums) {
const tails = []
for (const x of nums) {
let lo = 0, hi = tails.length
while (lo < hi) {
const mid = (lo + hi) >> 1
if (tails[mid] < x) lo = mid + 1
else hi = mid
}
tails[lo] = x
}
return tails.length
}- 时间
O(n log n),空间O(n) - tails 长度即 LIS 长度(tails 本身不一定是真实子序列,但长度正确)