记一次前端组内分享随笔:
let arr = []
while (arr.length !== 1000) { // 取一千个数
let a = random(0, 2000)
if (arr.join().indexOf(a) === -1) { // 如果已经有了 就不加进去了
arr.push(a)
}
}
function random(a, b) { // 随机函数 随机生成a和b之间的一个数
return Math.round(Math.random() * (b - a) + a)
}
console.log(`0-2000以内随机的1000个数字:${arr}」`)
console.log(`取出最长上升子序列:${lis(arr)}}}`)
console.log(`最长上升子序列长度:${lis(arr).length}`)
function lis(seq) {
const valueToMax = {}
let len = seq.length
for (let i = 0; i < len; i++) {
valueToMax[seq[i]] = 1
}
let i = len - 1
let last = seq[i]
let prev = seq[i - 1]
while (typeof prev !== 'undefined') {
let j = i
while (j < len) {
last = seq[j]
if (prev < last) {
const currentMax = valueToMax[last] + 1
valueToMax[prev] =
valueToMax[prev] !== 1 ? valueToMax[prev] > currentMax ? valueToMax[prev] : currentMax : currentMax
}
j++
}
i--
last = seq[i]
prev = seq[i - 1]
}
const lis = []
i = 1
while (--len >= 0) {
const n = seq[len]
if (valueToMax[n] === i) {
i++
lis.unshift(len)
}
}
return lis
}
运行效果如下: