Leetcode:1288. 删除被覆盖区间(贪心算法)

一道中等难度的LeetCode题目,要求删除列表中被其他区间覆盖的区间。通过排序区间,然后遍历并更新最远右边界来解决。示例展示了一种暴力解法和官方题解的思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1288. 删除被覆盖区间

难度中等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 != jintervals[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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值