代码随想录|贪心算法|18无重叠区间

leetcode:435. 无重叠区间 - 力扣(LeetCode)

题目

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

示例 1:

  • 输入: [ [1,2], [2,3], [3,4], [1,3] ]
  • 输出: 1
  • 解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

  • 输入: [ [1,2], [1,2], [1,2] ]
  • 输出: 2
  • 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

  • 输入: [ [1,2], [2,3] ]
  • 输出: 0
  • 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

思路

这个题跟上面一道题很像,我们记录重叠区间就行,但是有个区别:

[1,2] 和 [2,3]这两个区间是不重叠的!!!

// ---------------------------左边界排序,只计算重叠区间个数---------------------------------
class Solution
{
private:
    static bool cmp(const vector<int> &a, const vector<int> &b)
    {
        return a[0] < b[0];
    }

public:
    int eraseOverlapIntervals(vector<vector<int>> &intervals)
    {
        // 如果区间集合为空,直接返回0
        if (intervals.size() == 0)
            return 0;
        // 排序
        sort(intervals.begin(), intervals.end(), cmp);

        // 初始化重叠区间计数为0
        int overlap_count = 0;

        // 遍历排序后的区间集合
        for (int i = 1; i < intervals.size(); i++)
        {
            // 重叠的情况
            if (intervals[i][0] > intervals[i - 1][1])
            {
                // 增加重叠计数,并更新当前区间的结束位置为两个重叠区间中较小的结束位置
                overlap_count++;
                intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);
            }
        }

        // 返回重叠区间数量
        return overlap_count;
    }
};

也可以直接在上个题的代码基础上直接修改,这里的问题是求重叠区间个数,而上题弓箭的数量就是非交叉区间的数量,我们用总区间个数减去弓箭数量,就是需要移除区间的数量。

// ---------------------------上一题改版---------------------------------
class Solution
{
private:
    static bool cmp(const vector<int> &a, const vector<int> &b)
    {
        return a[0] < b[0];
    }

public:
    int eraseOverlapIntervals(vector<vector<int>> &intervals)
    {
        if (intervals.size() == 0)
            return 0;
        sort(intervals.begin(), intervals.end(), cmp);
        int count = 1;
        for (int i = 1; i < intervals.size(); i++)
        {
            // 不重叠
            if (intervals[i][0] >= intervals[i - 1][1])
            {
                count++;
            }
            else
            {
                intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);
            }
        }
        return intervals.size() - count;
    }
};

总结

重叠区间的问题,核心还是在min这一块,然后每道题的题目需要仔细看一下,端点重叠到底算不算区间重叠?

参考资料

代码随想录 

贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间_哔哩哔哩_bilibili 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值