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])
Vue3求最长递增子序列
最新推荐文章于 2025-01-05 20:14:28 发布