「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
题目:300. 最长递增子序列
解法一
function lengthOfLIS(nums) {
const len = nums.length;
// 存储每个元素的最长递增子序列长度
const top = new Array(len).fill(1);
for(let i = 0; i<len; i++){
for(let j = 0; j<i; j++) {
// 当前元素比前面的元素大,则更新dp[i]
if(nums[i] > nums[j]) {
// 当前元素的最长递增子序列长度 = 前面元素的最长递增子序列长度 + 1
top[i] = Math.max(top[i], top[j] + 1);
}
}
}
return Math.max(...top);
}
解法二
function lengthOfLIS() {
// 最长递增子序列的长度;
let max = 0;
const dp = new Array(len);
for(let i = 0; i< len; i++){
// 二分查找
let left = 0,
right = max;
while(left < right){
let mid = (right+left)>>1
if(dp[mid] < nums[i]){
//在左边
left = mid+1
}else{
right = mid
}
}
if(left == max) {
max++;
}
// 替换掉比当前元素大的那个
dp[left] = nums[i];
}
return max
}