435.无重叠的子区间

题目方法:
2种:
1贪心
2dp,其中贪心的效率更高

贪心思路:
把空间按照终点从小到大排序,这是因为结尾越小,留给后续区间的范围就越多,可能容纳的区间数也就越多

dp思路:
跟最长上升子序列一样,dp[n]代表选中n的前提下,从[0..n]中最多能保留的无重叠子区间的个数,之后遍历找到个数最多的情况num,然后返回n-num

贪心算法

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& t) {
        int n=t.size();
        if(n<2)
            return 0;
        
        sort(t.begin(),t.end(),cmp);
        int ret=0;
        int end=t[0][1];
        for(int i=1;i<n;i++){
            if(t[i][0]<end)
                ret++;
            else
                end=t[i][1];
        }
        return ret;
    }
private:
    static bool cmp(vector<int> a,vector<int> b){
        if(a[1]!=b[1])
            return a[1]<b[1];
        return a[0]<=b[0];
    }
};

动态规划

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& t) {
        int n=t.size();
        if(n<2)
            return 0;
        
        sort(t.begin(),t.end(),cmp);
        vector<int> dp(n,1);//dp代表选中n的前提下从【0.。n】最多能保留的区间数
        for(int i=1;i<n;i++)
            for(int j=0;j<i;j++)
                if(t[i][0]>=t[j][1])
                    dp[i]=max(dp[i],1+dp[j]);
        
        int num=1;
        for(int i=0;i<n;i++)
            if(num<dp[i])
                num=dp[i];
        
        return n-num;
        
    }
private:
    bool static cmp(vector<int> a,vector<int> b){
        return a[1]<=b[1];
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void ...
    希崽家的小哲阅读 6,651评论 0 12
  • 教程基本框架和部分内容转自Hawstein 出处:http://hawstein.com/posts/dp-nov...
    Wallace_QIAN阅读 1,192评论 2 3
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 1,575评论 0 2
  • 1、二分查找 二分查找思想简单,但是在实现时有一些需要注意的细节: 1、在计算 mid 时不能使用 mid = (...
    萌小熙喵阅读 644评论 0 1
  • 主题:上课 今天带星之去哈尼上课,第一节上感统课,因为好久没去了 所以她有点兴奋,进到大厅教室都没有什么抵触。上感...
    星之妈妈阅读 313评论 0 0

友情链接更多精彩内容