贪心算法系列:435 无重叠区间 452 用最少数量的箭引爆气球

18 篇文章 0 订阅
2 篇文章 0 订阅

参考:https://labuladong.gitbook.io/algo/dong-tai-gui-hua-xi-lie/tan-xin-suan-fa-zhi-qu-jian-tiao-du-wen-ti

贪心算法求解区间调度问题:

     正确的思路其实很简单,可以分为以下三步:

  1. 从区间集合 intvs 中选择一个区间 x,这个 x 是在当前所有区间中结束最早的(end 最小)。

  2. 把所有与 x 区间相交的区间从区间集合 intvs 中删除。

  3. 重复步骤 1 和 2,直到 intvs 为空为止。之前选出的那些 x 就是最大不相交子集

 435. 无重叠区间

bool compare(vector<int>& a, vector<int>& b) {
        return a[1] < b[1];
}

class Solution {
public:
    // bool compare(vector<int>& a, vector<int>& b) {
    //     return a[1] < b[1];
    // }

    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        const int n = intervals.size();
        if(n <= 1) return 0;

        sort(intervals.begin(), intervals.end(), compare);
        int count = 1;
        int end = intervals[0][1];
        for(int i = 1; i < intervals.size(); i++) {
            if(end <= intervals[i][0]) {
                end = intervals[i][1];
                count++;
            }
        }
        return intervals.size()-count;
    }
};

452. 用最少数量的箭引爆气球

这道题和区间调度算法一模一样,等价于区间调度算法(求最大不重叠子区间个数),只不过在这里边界重叠也算作重叠。

bool compare(vector<int>& a, vector<int>& b) {
    return a[1] < b[1];
}

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        int n = points.size();
        if(n == 0) return 0;

        sort(points.begin(), points.end(), compare);
        int count = 1, curEnd = points[0][1];
        for(int i = 1; i < points.size(); i++) {
            if(curEnd < points[i][0]) {
                count++;
                curEnd = points[i][1];
            }
        }
        return count;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值