前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 300. Longest Increasing Subsequence (DP)

LeetCode 300. Longest Increasing Subsequence (DP)

作者头像
ShenduCC
发布2020-06-01 16:54:20
3860
发布2020-06-01 16:54:20
举报
文章被收录于专栏:算法修养算法修养

题目

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

有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;
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档