-
题目:
一个vector<vector>intervals ,每个元素intervals[ i ] = [ intervals[ i ] [ 0 ],intervals[ i ] [ 1 ] ] 代表一个区间;
可以调整元素顺序,求最少删掉几个区间使得剩余区间不重叠;
区间相切不算重叠; -
思路:
依然是先排序:按区间的左边界排序
从左到右遍历,从最小右边界考虑哪些需要删,哪些需要留
//直接统计需要删除的
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int len = intervals.size();
if (len <= 1) return 0;
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, vector<int>& b){ return a[0] == b[0] ? a[1] < b[1] : a[0] < b[0]; });
int moveNums = 0, minR = intervals[0][1];
for (int i = 1; i < len; ++i) {
if (intervals[i][0] < minR) {
++moveNums;
minR = min(minR, intervals[i][1]);
}
else minR = intervals[i][1];
}
return moveNums;
}
};
//统计留的,最后删的 = n - 留的
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int n = intervals.size();
if (n <= 1) return 0;
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){ return a[0] == b[0] ? (a[1] < b[1]) : (a[0] < b[0]); });
int remain = 1; //统计留下的数目
int minR = intervals[0][1]; //最小右边界
for (int i = 1; i < n; ++i) {
if (intervals[i][0] >= minR) {
++remain;
minR = intervals[i][1];
}
else minR = min(minR, intervals[i][1]);
}
return n - remain;
}
};
- 总结:
这类题都是排序 + 遍历,然后从边界下功夫