js求任意数内的最长上升子序列

记一次前端组内分享随笔:

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
}

运行效果如下:


image.png

你可能感兴趣的:(js求任意数内的最长上升子序列)