2 分钟阅读

困难算法题,最长递增子序列,使用 JavaScript 语言编写

题目

给你一个整数数组 nums,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

输入格式

1 <= nums.length <= 2000 -10000 <= nums[i] <= 10000

输出格式

最长严格递增子序列的长度

输入样例

10 9 2 5 3 7 101 18

输出样例

4

分析

解答


// 这是题目要求的输入格式
let inputs = `
10 9 2 5 3 7 101 18
`;
const nums = inputs.trim().split(' ').map(Number);

function lengthOfLIS(nums) {
  if (nums.length === 0) return 0;

  const dp = new Array(nums.length).fill(1);

  for (let i = 1; i < nums.length; i++) {
    for (let j = 0; j < i; j++) {
      if (nums[j] < nums[i]) {
        dp[i] = Math.max(dp[i], dp[j] + 1);
      }
    }
  }
  return Math.max(...dp);
}

function lengthOfLIS2(nums) {
  const stack = [];
  let ret = 0;
  while (nums.length > 0) {
    let f = nums.shift();
    while (stack.length > 0 && stack[stack.length - 1] >= f) {
      stack.pop();
    }
    stack.push(f);
    ret = Math.max(ret, stack.length);
  }
  return ret;
}

// 示例
console.log(lengthOfLIS2(nums)); // 输出 4

留下评论