Skip to content

两层循环解决,找更小的就是了 时间复杂度n^2

ts
function lengthOfLIS(nums: number[]): number {
    if(!nums.length) return 0;
    let dp:number[] = new Array(nums.length).fill(1);

    for(let i=1;i<nums.length;i++){
        for(let j=0;j<i;j++){
            if(nums[i]>nums[j])
            dp[i] = Math.max(dp[i],dp[j]+1);
        }
    }
    return Math.max(...dp)
};

时间复杂度nlogn

ts
function lengthOfLIS(nums: number[]): number {
    if (!nums.length) return 0;

    // tails[i]表示长度为i+1的递增子序列的最小结尾元素
    let tails: number[] = [];

    for (const num of nums) {
        // 二分查找num应该放在tails的位置
        let left = 0, right = tails.length;
        while (left < right) {
            const mid = Math.floor((left + right) / 2);
            if (tails[mid] < num) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }

        if (left === tails.length) {
            // 没找到大于等于num的元素,说明num比所有已有元素都大
            // 这意味着可以形成一个更长的递增子序列
            tails.push(num);
        } else {
            // 找到了大于等于num的元素,位置在left
            // 把该位置的值更新为num(更小或相等的值)
            tails[left] = num;
        }
    }

    return tails.length;
}
本站访客数 人次 本站总访问量