最长递增子序列(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
}

同分类其他题目