在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。

一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为
xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。

给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。


提示:


方法一:排序 + 贪心算法

我们首先随机地射出一支箭,再看一看是否能够调整这支箭地射出位置,使得我们可以引爆更多数目的气球。

如图 1-1
所示,我们随机射出一支箭,引爆了除红色气球以外的所有气球。我们称所有引爆的气球为「原本引爆的气球」,其余的气球为「原本完好的气球」。可以发现,如果我们将这支箭的射出位置稍微往右移动一点,那么我们就有机会引爆红色气球,如图
1-2 所示。

那么我们最远可以将这支箭往右移动多远呢?我们唯一的要求就是:原本引爆的气球只要仍然被引爆就行了。这样一来,我们找出原本引爆的气球中右边界位置最靠左的那一个,将这支箭的射出位置移动到这个右边界位置,这也是最远可以往右移动到的位置:如图
1-3 所示,只要我们再往右移动一点点,这个气球就无法被引爆了。


这是为什么?我们考虑任意一种最优的方法,对于其中的任意一支箭,我们都通过上面描述的方法,将这支箭的位置移动到它对应的「原本引爆的气球中最靠左的右边界位置」,那么这些原本引爆的气球仍然被引爆。这样一来,所有的气球仍然都会被引爆,并且每一支箭的射出位置都恰好位于某一个气球的右边界了。
有了这样一个有用的断定,我们就可以快速得到一种最优的方法了。考虑所有气球中右边界位置最靠左的那一个,那么一定有一支箭的射出位置就是它的右边界(否则就没有箭可以将其引爆了)。当我们确定了一支箭之后,我们就可以将这支箭引爆的所有气球移除,并从剩下未被引爆的气球中,再选择右边界位置最靠左的那一个,确定下一支箭,直到所有的气球都被引爆。

上代码:


class Solution {public int findMinArrowShots(int[][] points) {if (points.length == 0) {return 0;}Arrays.sort(points, new Comparator<int[]>() {public int compare(int[] point1, int[] point2) {if (point1[1] > point2[1]) {return 1;} else if (point1[1] < point2[1]) {return -1;} else {return 0;}}});int pos = points[0][1];int ans = 1;for (int[] balloon: points) {if (balloon[0] > pos) {pos = balloon[1];++ans;}}return ans;}
}


强烈建议在纸上用笔画出推导过程,有助于加强理解!

为什么我要用按右端升序排序?(重点)

这里有一位大神讲解的很清楚,建议一看。
传送门

LeetCode算法解析之“箭爆气球问题”相关推荐

  1. leetcode 算法解析(一):260. Single Number III(C++版本和自己的注解)

    这个题来自<剑指offer>但是书上上感觉讲解不太详细,还是看博客吧(我把下面博客改写成了C++版本运行通过) 注意这个题的相关代码中,输入的数组只能有两个数出现一次,如果有第三个数出现一 ...

  2. LeetCode算法解析之“贪心”解决反转矩阵最大得分问题

    有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后,将该矩阵的每一 ...

  3. 用少量箭射爆气球,leetcode习题

    用少量气球射爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了.开始坐标总 ...

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

    题目描述 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了.开始坐标总是小于结束 ...

  5. 无重叠区间及用最少的箭射爆气球

    无重叠区间及用最少的箭射爆气球 文章目录 无重叠区间及用最少的箭射爆气球 **一:开胃菜** **二.无重叠区间** **三.用最少的箭射爆气球** 一:开胃菜 在开始所无重叠区间前先做一道简单的提来 ...

  6. c语言贪心算法合并箭,贪心算法:用最少数量的箭引爆气球

    ❝ 通知:一些录友表示经常看不到每天上午的文章,现在公众号已经不按照发送时间推荐了,而是根据一些规则乱序推送,所以可能关注了「代码随想录」也一直看不到文章,建议把「代码随想录」设置星标哈,设置星标之后 ...

  7. 贪心法—LeetCode 452 用最少数量的箭引爆气球

    用最少数量的箭引爆气球 题目: 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了 ...

  8. Suzy想吃烤蛋挞了Day35 | 贪心算法进行时:860. 柠檬水找零,406. 根据身高重建队列,452. 用最少数量的箭引爆气球

    860. 柠檬水找零 solution 不要漏掉的一种情况是:如果收到了20,可以找10+5,或者5+5+5 class Solution:def lemonadeChange(self, bills ...

  9. Leetcode分类解析:组合算法

    Leetcode分类解析:组合算法 所谓组合算法就是指:在解决一些算法问题时,需要产生输入数据的各种组合.排列.子集.分区等等,然后逐一确认每种是不是我们要的解.从广义上来说,组合算法可以包罗万象,甚 ...

  10. Java实现 LeetCode 452 用最少数量的箭引爆气球

    452. 用最少数量的箭引爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够 ...

最新文章

  1. 混合密度网络(MDN)进行多元回归详解和代码示例
  2. App icon和启动图的尺寸需求(没有iPad)
  3. 【JavaScript】【PPT】继承的本质
  4. 贝叶斯机器学习:经典模型与代码实现
  5. php连接mysql开发环境_PHP开发环境搭建及常用的数据库操作
  6. 【Linux】swap分区简介及空间增加方式
  7. 网络舆情监测在教育行业的必要性
  8. CAN总线介绍及硬件设计
  9. Unity 泛型单例
  10. 线程同步之条件变量:pthread_cond_signal和pthread_cond_wait
  11. 2014 年总结--【宽容待人】
  12. 图像处理中的 亮度, 灰度, 对比度等概念
  13. 2021年工业软件行业研究报告
  14. 如何防止Excel工作表名称被修改
  15. 央视新闻30分:开心网流行背后存在的隐忧
  16. Jenkins无法启动:com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy
  17. 进入docker容器后,按删除键是空格解决办法
  18. SUSAN角点检测算法,及其Matlab实现
  19. 华为交换机维护助手配置案例-定时任务自动ping测
  20. 国内 Github 下载加速

热门文章

  1. 初手学堂:跟我学习安装配置RedHat9.0
  2. U盘chk文件该怎样用EasyRecovery恢复
  3. akka-typed(10) - event-sourcing, CQRS实战
  4. jQuery 已经落幕了~
  5. 【SYS/BIOS】4.2节同步模块之事件模块
  6. Fabric chaincode shim.ChaincodeStubInterface
  7. vue字符串生成二维码的相关组件
  8. 生成验证码并判断用户是否输入正确
  9. win10常用快捷键及命令行
  10. 2020南京市(徐庄)高层次创业人才引进计划开启申报