难度中等20收藏分享切换为英文接收动态反馈
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 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]
通过次数4,273提交次数7,698
这道题我比较蠢,想了想还是用了暴力循环来做,也是能过的,但看了解析后也发现自己的思路也是往正确的思路靠的,既然是要覆盖,那么刚开始就排序,把左边界小的排在最前面,依次遍历,如果覆盖,就改变计数器,
为了抛弃覆盖的值,我用了在数据范围外的值来代替,不过看了解析发现我也是在是蠢,首先排序后显然左边界已经是确定了的,只要判断有边界即可,那么每次获得现在所有的最远的右边界,比较,更新即可
贴上自己的蠢驴代码和官方题解
//我的代码
class Solution {
public:
int removeCoveredIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),[](vector<int>&a,vector<int>&b){
return a[0]==b[0]?a[1]>b[1]:a[0]<b[0];
});
int cnt=0;
for(int i=0;i<intervals.size();i++){
int a=intervals[i][0];
if(a==100001) continue;
int b=intervals[i][1];
cout<<a<<" "<<b<<endl;
for(int j=i+1;j<intervals.size();j++){
int a2=intervals[j][0];
if(a2==100001) continue;
int b2=intervals[j][1];
if(a<=a2&&b>=b2){
cnt++;
intervals[j][0]=100001;
}
}
}
return intervals.size()-cnt;
}
};
//官方代码
class Solution {
public:
int removeCoveredIntervals(vector<vector<int>>& intervals) {
sort(begin(intervals),end(intervals),[](const vector<int>&o1,const vector<int>&o2){
return o1[0]==o2[0]?o2[1]<o1[1]:o1[0]<o2[0];
});
int count=0;
int end,pre_end=0;
for(auto curr:intervals){
end=curr[1];
if(pre_end<end){
count++;
pre_end=end;
}
}
return count;
}
};