无重叠区间
题目描述:
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠
输入输出样例
Input: [ [1,2], [2,3], [3,4], [1,3] ]
Output: 1
题解:
因为在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间就越大,就越能保留更多的区间。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。具体实现方法为,先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选择的区间不重叠的区间。我们这里使用ort()函数进行自定义排序。然后再对排序后的区间进行判断。
具体代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class L435 {
public:
bool com(vector<int> a, vector<int> b) {
return a[1] < b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.empty()) {
return 0; //首先判断是否为空
}
int size = intervals.size();//得到区间数量
sort(intervals.begin(), intervals.end(), com);
//按照区间尾从小到大排序
int total = 0, prev = intervals[0][1];
for (int i = 1; i < size; ++i) {
if (intervals[i][0] < prev) {
++total;
} else {
prev = intervals[i][1];
}
}
return total;
}
};