【leetcode 435. 无重叠区间】贪心策略:优先保留结尾小且不相交的区间,即局部最优连续区间

链接地址:【leetcode 435. 无重叠区间】贪心策略:优先保留结尾小且不相交的区间,即局部最优连续区间

解题思路:
贪心策略:优先保留结尾小且不相交的区间,即局部最优连续区间

1,按照小区间的结尾大小,进行增序排序,利用std::sort()函数结合lambda表达式进行自定义排序来实现。
2,初始化连续不相交区间的末尾区间的结尾
3,判断,当前区间的结尾小于等于后一个区间的起点,证明不重叠,更新连续不相交区间的末尾区间的结尾;否则重叠,++count。
4,继续循环判断,直到末尾

在这里插入图片描述

使用++和- -的小技巧:++n和n++都是将n加1,只是n++的返回值为n,而++n的返回值为n+1。所以如果只是希望增加n的值,而不需要返回值,则推荐使用++n,其运行速度会稍微快一些

代码:

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
    
    //区间按照结尾大小进行增序排序,利用std::sort()函数结合lambda表达式进行自定义排序来实现。
    sort(intervals.begin(),intervals.end(),[](vector<int>&a,vector<int>&b){return a[1] < b[1];});
    
    int length = intervals.size();		//总区间的个数
    int count = 0;		//记录被删除区间的个数
    int record = intervals[0][1];//连续不相交区间的末尾区间的结尾
    
    //因为已经排序且已经保留第一个区间的末尾,所以从i=1开始
    for(int i = 1; i < length; ++i)
    {
        //连续不相交区间的末尾区间的结尾小于等于后一个区间的起点。
        if( record <= intervals[i][0])
        {
            record = intervals[i][1];	//证明此区间不重叠,更新record
        }
        else    //重叠
            ++count;
        
    }
     return count;
     
    }
};

   

如有不足之处,还望指正 [1]


  1. 如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎

posted @ 2021-05-27 10:47  CoutCodes  阅读(67)  评论(0编辑  收藏  举报