题目(leecode T435):
给定一个区间的集合 intervals
,其中 intervals[i] = [starti, endi]
。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
方法:互不重叠的区间,和之前的用箭射气球很像。其实都是用来计算区间内是否有重叠的部分。因此方法也是一致的,先将区间进行排序,按照左或右排序都是可以的。这里我们按照右区间从小到大的顺序排序。首先我们定义第一个区间的右区间为边界,随后判断它和第二个的左边界是否有重合,如果没有,我们就将第二个的右边界定为边界,并定义count计数加一。但如果有重合的话我们取一二的最小右边界,判断它和第三个区间有无重合。以此类推到最后我们就找到了所有的不重合的区间的数量,用总区间数量减去不重合的区间数量就是要删除掉的总数量。
题解:
class Solution {
public:
static bool cmp(vector<int>& a, vector<int>& b){ //按右边界排序
return a[1] < b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.size() == 0) return 0;
int count = 1;
sort(intervals.begin(), intervals.end(), cmp);
int end = intervals[0][1]; //定义初始右边界
for(int i = 1; i < intervals.size(); i++){
if(intervals[i][0] >= end){
end = intervals[i][1];
count++; //非重叠区间数量
}
}
return intervals.size() - count;
}
};