Vue3求最长递增子序列

本文介绍如何在Vue3中使用JavaScript解决算法问题,探讨如何找到一个数列的最长递增子序列,并提供具体的代码实现和步骤解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

function getSequence(arr) {
  let len = arr.length;
  const result = [0]; // 这里放的是索引
  let p = arr.slice(0); // 用来记录前驱节点的索引, 用来追溯正确的顺序
  let lastIndex;
  let start;
  let end;
  let middle;

  for (let i = 0; i < len; i++) {
    const arrI = arr[i]
    // 0表示追加节点
    if (arrI !== 0) {
      lastIndex = result[result.length - 1] // 取出最后一个索引

      // 1. 直接看元素 如果比当前的末尾大,直接追加
      if (arr[lastIndex] < arrI) {
        p[i] = lastIndex // 记录当前前一个人的索引
        result.push(i)
        continue
      }

      // 二分查找 替换元素   [1,2,3,4]
      start = 0;
      end = result.length - 1;
      while (start < end) {
        middle = ((start + end) / 2) | 0 // 向下取整
        // 找到序列中间的索引,通过索引找到对应的值
        if (arr[result[middle]] < arrI) {
          start = middle + 1
        } else {
          end = middle
        }
      }
      if (arrI < arr[result[start]]) {
        p[i] = result[start - 1]
        result[start] = i
      } // 找到更有潜力的,替换之前的(贪心算法)
    }
  }
  let i = result.length
  let last = result[i - 1]

  while (i-- > 0) {
    result[i] = last
    last = p[last]
  }
  return result
}

getSequence([2, 3, 1, 5, 6, 8, 7, 9, 4])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值