139、【贪心算法】leetcode ——435. 无重叠区间(更新区间+记录不重叠区间)(C++版本)

文章介绍了如何使用排序来解决435.无重叠区间的问题。第一种方法是按左边界排序,当出现重叠时更新右边界;第二种方法是按右边界排序,记录不重叠区间。两种策略均通过比较和删除重叠区间来找到最少删除的区间数。
摘要由CSDN通过智能技术生成

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原题链接:435. 无重叠区间

解题思路

1、排序左边界,重叠时更新右边界

思路类似于 452. 用最少数量的箭引爆气球(贪心重叠问题) ,每次对比前后两个区间,当出现重叠区间时候,去除个数加一,让后者的右边界变为前后两个区间右边界的最小值(选取右边界小的区间,才会让后续更不容易产生重叠)。

class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        return a[0] < b[0];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.size() == 1)           return 0;
        sort(intervals.begin(), intervals.end(), cmp);
        int res = 0;
        for(int i = 1; i < intervals.size(); i++) {
            if(intervals[i - 1][1] > intervals[i][0]) {                         // 当出现重叠区间
                res++;                                                          // 需删除一个
                intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);    // 让对的右边界选最小的那个对比
            }
        }
        return res;
    }
};

2、排序右边界,只记录不重叠区间

将右边界从小到大排序,每次仅记录不重叠区间(出现重叠区间时,按题中要求一定会被最少删除一个区间)。然后用整个区间个数减去不重叠区间个数,就是需要删除的区间个数。

class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        return a[1] < b[1];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.size() == 1)           return 0;
        sort(intervals.begin(), intervals.end(), cmp);
        int nonres = 1, end = intervals[0][1];
        for(int i = 1; i < intervals.size(); i++) {
            if(end <= intervals[i][0]) {           // 记录不重叠的区间个数
                nonres++;
                end = intervals[i][1];
            }   
        }
        return intervals.size() - nonres;
    }
};

参考文章:435. 无重叠区间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰阳星宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值