【路飞】最长递增子序列

194 阅读1分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

题目:300. 最长递增子序列

image.png

解法一

function lengthOfLIS(nums) {
    const len = nums.length;
    // 存储每个元素的最长递增子序列长度
    const top = new Array(len).fill(1);
    for(let i = 0; i<len; i++){
        for(let j = 0; j<i; j++) {
            // 当前元素比前面的元素大,则更新dp[i]
            if(nums[i] > nums[j]) {
                // 当前元素的最长递增子序列长度 = 前面元素的最长递增子序列长度 + 1
                top[i] = Math.max(top[i], top[j] + 1);
            }
        }
    }
    return Math.max(...top);
}

解法二

function lengthOfLIS() {
  // 最长递增子序列的长度;
  let max = 0;
  const dp = new Array(len);
  for(let i = 0; i< len; i++){
      // 二分查找
      let left = 0,
      right = max;
      while(left < right){
          let mid = (right+left)>>1
          if(dp[mid] < nums[i]){
            //在左边
            left = mid+1
          }else{
            right = mid
          }
      }
      if(left == max) {
        max++;
      }
      // 替换掉比当前元素大的那个
      dp[left] = nums[i]; 
  }
  return max
}