解题思路:
贪心策略:优先保留结尾小且不相交的区间,即局部最优连续区间
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。
如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎