题目描述
原题链接:435. 无重叠区间
解题思路
1、排序左边界,重叠时更新右边界
思路类似于 452. 用最少数量的箭引爆气球(贪心重叠问题) ,每次对比前后两个区间,当出现重叠区间时候,去除个数加一,让后者的右边界变为前后两个区间右边界的最小值(选取右边界小的区间,才会让后续更不容易产生重叠)。
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.size() == 1) return 0;
sort(intervals.begin(), intervals.end(), cmp);
int res = 0;
for(int i = 1; i < intervals.size(); i++) {
if(intervals[i - 1][1] > intervals[i][0]) { // 当出现重叠区间
res++; // 需删除一个
intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]); // 让对的右边界选最小的那个对比
}
}
return res;
}
};
2、排序右边界,只记录不重叠区间
将右边界从小到大排序,每次仅记录不重叠区间(出现重叠区间时,按题中要求一定会被最少删除一个区间)。然后用整个区间个数减去不重叠区间个数,就是需要删除的区间个数。
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[1] < b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.size() == 1) return 0;
sort(intervals.begin(), intervals.end(), cmp);
int nonres = 1, end = intervals[0][1];
for(int i = 1; i < intervals.size(); i++) {
if(end <= intervals[i][0]) { // 记录不重叠的区间个数
nonres++;
end = intervals[i][1];
}
}
return intervals.size() - nonres;
}
};
参考文章:435. 无重叠区间