leetcode 1288. 删除被覆盖区间
问题描述
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例:
输入:intervals = [[1,4],[3,6],[2,8]]
输出:2
解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。
代码
class Solution {
public:
int removeCoveredIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
int n = intervals.size(),ans = 0;
//for(int i = 0; i < intervals.size(); ++i)
// cout<<"("<<intervals[i][0]<<" , "<<intervals[i][1]<<") "<<endl;
int left = intervals[0][0],right = intervals[0][1];
for(int i = 1; i < n; ++i)
{
//因为我们已经对端点排好序了,左端点升序,所以一定有left <= intervals[i][0]
//因此只需要考虑右端点
if(right >= intervals[i][1])
ans++;
else
right = intervals[i][1];
}
return n-ans;
}
//按照起点升序排列,如果起点相同则按照终点降序排列
static bool cmp(vector<int>&a,vector<int>&b)
{
if(a[0] == b[0])
return a[1] > b[1];
else
return b[0] > a[0];
}
};
注意右端点一定要降序排列,不然出现以下情况
|----------------|
|---------------------------|
判断不出
结果
执行用时:56 ms, 在所有 C++ 提交中击败了85.42%的用户
内存消耗:11.4 MB, 在所有 C++ 提交中击败了34.72%的用户