const arr = [10,5,6,7,4,1,2,8,9]
function lis(arr) {
const infoArray = []
let len = arr.length,
dp = new Array(len).fill(1); // 用于保存长度
// i = 0 => O(n^2) ; i != 0 => O(nlogn)
for (let i = len - 1; i >= 0; i--) {
let cur = arr[i]
for(let j = i + 1; j < len; j++) {
let next = arr[j]
// 如果是递增 取更大的长度值
if (cur < next) dp[i] = Math.max(dp[j]+1, dp[i])
infoArray.push({
'i': i,
'j': j,
'cur': cur,
'next': next,
'dp[i]': dp[i]
})
}
}
console.log('dp', dp)
console.table(infoArray, ['i', 'j', 'cur', 'next', 'dp[i]'])
return Math.max(...dp)
}
// 此例子中,连续递增的子序列是 [5,6,7,8,9], 所以返回的个数是5;
lis(arr) // 5
// 由算法可以看出:在最好的情况下即 i != 0 的条件下,平均的时间复杂度是O(nlgn) 那么在 i = 0 时,时间复杂度为O(n^2)
最长递增子序列
最新推荐文章于 2024-11-16 14:11:26 发布