前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >射击气球

射击气球

作者头像
小飞侠xp
发布2018-08-29 14:38:59
5380
发布2018-08-29 14:38:59
举报

LeetCode 452. Minimum Number of Arrows to Burst Balloons 已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位 置安排弓箭手向y轴方向射箭,弓箭可以向y轴走无穷远;给定气球的宽度 xstart ≤ x ≤ xend,问至少需要多少弓箭手,将全部气球打爆? 例如: 四个气球 : [[10,16], [2,8], [1,6], [7,12]],至少需要2个弓箭手。

贪心规律

1.对于某个气球,至少需要使用1只弓箭将它击穿。 2.在这只气球将其击穿的同时,尽可能击穿其他更多的气球!(贪心!)

算法思路

1.对各个气球进行排序,按照气球的左端点从小到大排序。 2.遍历气球数组,同时维护一个射击区间,在满足可以将当前气球射穿的 情况下,尽可能击穿更多的气球,每击穿一个新的气球,更新一次射 击区间(保证射击区间可以将新气球也击穿)。 3.如果新的气球没办法被击穿了,则需要增加一名弓箭手,即维护一个新 的射击区间(将该气球击穿),随后继续遍历气球数组。

代码语言:javascript
复制
#include <algorithm>
#include<vector>
bool cmp(const std::pair<int,int> &a,const std::pair<int ,int> &b){
    return a.first < b.first;//无需考虑左端点相同时的排序
class Solution{
public:
    int findMinArrowShots(std::vetor<std::pair<int,int>> &points){
    if(points.size() == 0){
        return 0;
    }
    std::sort(points.begin(),points.end(),cmp);//对气球按照左端点从小到大排序
    int shoot_num = 1;//初始化弓箭手数量为1
    int shoot_begin = points[0].first;//初始化射击区间,即为第一个气球的两端点
    int shoot_end = points[0].second;
    for(int i =1; i< points.size();i++){
        if(point[i].first <shoot_end){
            shoot_begin = points[i].first;
            if(shoot_end > points[i].second){
                shoot_end = points[i].second;
            }
        }
        else{
            shoot_num ++;
            shoot_begin = points[i].first;
            shoot_end = points[i].second;
        }
}
    return shoot_num;
}
}; 
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.03.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 贪心规律
  • 算法思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档