无重叠区间
题目描述:给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
示例1
输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例2:
输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例3:
输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
我们看到这里肯定会想起合并区间这道题,这是对合并区间这道题的讲解,大部分人就会想的是可以采用相同的相同的方法将可以合并的区间合并,然后计算出合并了几次n,然后将这个值返回就可以得到结果,实际不是这样的。
这里我们采用相通的思路,但是我们在排序的时候是用[start,end]中的end来进行排序的关键因素。我们以示例1进行讲解:
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty())return 0;
sort(intervals.begin(),intervals.end(),[](const auto&u,const auto&v)
{
return u[1]<v[1];
});
int n=intervals.size();
int ans=1;
int right=intervals[0][1];
for(int i=1;i<n;++i)
{
if(intervals[i][0]>=right)
{
++ans;
right=max(right,intervals[i][1]);//更新起始值
}
}
return n-ans;
}
};