专栏首页算法修养LeetCode 300. Longest Increasing Subsequence (DP)

LeetCode 300. Longest Increasing Subsequence (DP)

题目

经典题目,最长递增子序列。

有O(n^2)效率,还有O(n*logn)效率的。 O(n^2)的效率很好理解的啦,就是大家最常见的那种DP

O(n*logn) 的方法是维护一个递增的栈,这个栈不等于最长递增子序列。但是数组的长度一定是等于最长递增子序列的长度的。 遍历原始数组,每次的操作是把当前元素和递增栈的最后一个元素作比较,如果大于直接入栈,否则就找到大于等于它的最小的元素,然后替换掉。这个思想的来源是贪心,而不是DP

O(n^2)

class Solution {
public:
    int dp[5005];
    int lengthOfLIS(vector<int>& nums) {
        
        int ans=0;
        for(int i=0;i<nums.size();i++)
        {
            dp[i]=1;
            for(int j=i-1;j>=0;j--)
            {
                if(nums[i]>nums[j])
                    dp[i]=max(dp[i],dp[j]+1);
            }
            ans=max(ans,dp[i]);
        }
        
        return ans;
        
        
    }
};

O(n*logn)

class Solution {
public:
    int dp[5005];
    int len;
    int lengthOfLIS(vector<int>& nums) {
        
        len=0;
        for(int i=0;i<nums.size();i++)
        {
            if(len==0||nums[i]>dp[len-1])
                dp[len++]=nums[i];
            else
            {
                int index = find(nums[i]);
                dp[index]=nums[i];
            }
        }
       
        return len;
        
    }
    
    int find(int x)
    {
        int l = 0;
        int r = len-1;
        while(l<=r)
        {
            int mid = (l+r)/2;
            if(dp[mid]<x)
            {
                l = mid+1;
            }
            else if(dp[mid]>x)
            {
                r = mid-1;
            }
            else
                return mid;
        }
        
        return l;
    }
};

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CodeForces 1143A The Doors

    ShenduCC
  • poj-1185 炮兵阵地

    炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22654 ...

    ShenduCC
  • 天梯赛 大区赛 L3-014.周游世界 (Dijkstra)

    L3-014. 周游世界 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standar...

    ShenduCC
  • Leetcode 153 Find Minimum in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i....

    triplebee
  • leetcode第197场周赛

    如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。

    你的益达
  • 算法细节系列(21):贪心有理?

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • 51nod 1135 原根(原根)

    那么预处理出\(P - 1\)的所有的质因数\(p_1, p_2 \dots p_k\),暴力判断一下,如果$\exists i, a^{\frac{P - 1...

    attack
  • P1352 没有上司的舞会

    题目描述 某大学有N个职员,编号为1~N。他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。现在有个周年庆宴会,宴会每邀...

    attack
  • LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)

    请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。

    Michael阿明
  • Palindrome - 5. Longest Palindromic Substring

    Given a string s, find the longest palindromic substring in s. You may assume th...

    用户5705150

扫码关注云+社区

领取腾讯云代金券