给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 c <= a
且 b <= d
时,我们才认为区间 [a,b)
被区间 [c,d)
覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例:
输入:intervals = [[1,4],[3,6],[2,8]] 输出:2 解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。
提示:
1 <= intervals.length <= 1000
0 <= intervals[i][0] < intervals[i][1] <= 10^5
- 对于所有的
i != j
:intervals[i] != intervals[j]
方法1:左右边界都升序
class Solution { public: int removeCoveredIntervals(vector<vector<int>>& intervals) { sort(begin(intervals), end(intervals)); int res = 1,left = intervals[0][0],right = intervals[0][1]; for(int i = 1;i < intervals.size();i++) { auto v = intervals[i]; if (v[0]==left) { if (v[1] == right) { //[1,3] + [1,3] ; } else { // v[1] > right [1,3] + [1,5] right = v[1]; } } else { //v[1]>left if (v[1]>right) { // [1,3] + [2,4] right = v[1]; left = v[0]; res++; } else { // v[1] < right // [1,3] + [2,3] ;//被吃掉 } } } return res; } };
class Solution { public: int removeCoveredIntervals(vector<vector<int>>& intervals) { // 按照起点升序排列,起点相同时降序排列 sort(begin(intervals), end(intervals), [](const vector<int> &a, const vector<int> &b) { return a[0] != b[0] ? a[0] < b[0] : a[1] > b[1]; }); int res = 0; int left = INT_MAX; int right = INT_MIN; for(int i = 0;i < intervals.size();i++) { if (intervals[i][1] > right && left != intervals[i][0]) { left = intervals[i][0]; right = intervals[i][1]; res++; } } return res; } };