用最少数量的箭引爆气球

该博客介绍了如何用最少数量的箭来引爆所有气球的算法思路。首先通过画图理解题意,然后利用排序按照气球左端点进行排序,接着遍历气球数组,通过维护一个射击区间并贪心地尽可能击穿更多气球,以此确定最少箭的数量。当新气球的左端点小于当前射击区间的右端点时,更新射击区间,反之则需要增加箭的数量。最终返回所需的箭数。
摘要由CSDN通过智能技术生成

/*
思考:首先将样例画图,找出规律理解题意,其次举例子,1个气球最少用1个箭,2个重叠气球最少用一个箭,3个重叠气球最少用一个箭
因此,尽量使气球重叠部分最多一些,那么如何算法化呢?当然是排序,然后遍历维护射击区间。
1,排序,按照左端点。
2,遍历气球数组,维护一个设计区间,初始化就是第一个气球的区间,同时贪心尽可能多的击穿更多气球,然后更新设计区间。
3,直到没有新的气球可以被击穿,那么增加箭,同时维护一个新的射击区间。
*/
bool cmp(const std::vector<int> &a, const std::vector<int > &b) {
    return a[0] < b[0];//用于无需考虑左端点相同时候的排序
}
class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
    if (points.size() == 0){
            return 0;//传入数据为空直接返回
        }
        std::sort(points.begin(), points.end(), cmp);//按照左端点排序
        int shoot_num = 1;
        int shoot_begin = points[0][0];
        int shoot_end = points[0][1];//初始化弓箭数目,第一个维护射击区间,就是第一个气球的左右端点
        for (int i = 1; i < points.size(); i++){//此处就是遍历更新射击空间
            if (points[i][0] <= shoot_end){
                shoot_begin = points[i][0]; //新气球左端点小于设计区间右端点,那么说明可以击穿,更新射击区间左端点
                if (points[i][1] < shoot_end){
                    shoot_end = points[i][1];//新球右端点小于设计区间左端点,那么说明可以击穿,更新设计区间右端点
                    //设计区间维护其实就是在不断缩小射击区间
                }
            }
            else{//不满足情况时,多用一个弓箭
                shoot_num++;
                shoot_begin = points[i][0];
                shoot_end = points[i][1];//初始化新的弓箭设计区域
            }
        }
        return shoot_num;    
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值