题目

https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/

题解

重叠区间问题可以总结为在坐标轴上若干个位置为 (start(i),end(i)) 的区间,要求求解这些区间中有多少个不重叠区间,或者合并重叠的区间。

对于重叠区间问题,海外版评论区有人总结了模板,见 A Concise Template for “Overlapping Interval Problem”

该问题分两类:第一类求重叠区间个数(leetcode 452,435),第二类求合并后的区间(leetcode 56,763)。
对于第一类问题,通常按照end排序,维护一个end变量即可。
对于第二类问题,通常按照start排序,维护一个数组,每次取最后一个数作为比较的标准。
注意按照 start 或者 end 排序两种方式都可以求解,只是在不同情况下用其中之一代码编写更简洁。

本文总结了leetcode中重叠区间问题的题目,涉及到的题目如下:

  • leetcode 56 合并区间
  • leetcode 452 射气球
  • leetcode 435 无重叠区间
  • leetcode 763 划分字母区间
本题思路

回到本题,思路是,维护一个小根堆,里面存 end,当 start 大于最小的 end 时,说明前面的线段和当前的线段不可能同时被切,所以把前面的线段全部一刀切。

后来发现,不需要维护小根堆,只要用一个变量维护最小值就可以了。

class Solution {public int findMinArrowShots(int[][] points) {Arrays.sort(points, (o1, o2) -> (long) o1[0] - (long) o2[0] > 0 ? 1 : -1);int count = 0;long minEnd = Long.MAX_VALUE;for (int[] pair : points) {if (minEnd != Long.MAX_VALUE && pair[0] > minEnd) {minEnd = Long.MAX_VALUE;count++;}minEnd = Math.min(minEnd, pair[1]);}return count + 1; // 清算结尾}
}

思路来源:左程云“最大线段重合问题”

另外,对于“求重叠最多的绳子条数”问题,见视频 15:49

package class04_07;import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;public class Code01_CoverMax {public static int maxCover1(int[][] lines) {int min = Integer.MAX_VALUE;int max = Integer.MIN_VALUE;for (int i = 0; i < lines.length; i++) {min = Math.min(min, lines[i][0]);max = Math.max(max, lines[i][1]);}int cover = 0;for (double p = min + 0.5; p < max; p += 1) {int cur = 0;for (int i = 0; i < lines.length; i++) {if (lines[i][0] < p && lines[i][1] > p) {cur++;}}cover = Math.max(cover, cur);}return cover;}public static int maxCover2(int[][] m) {Line[] lines = new Line[m.length];for (int i = 0; i < m.length; i++) {lines[i] = new Line(m[i][0], m[i][1]);}Arrays.sort(lines, new StartComparator());// 小根堆,每一条线段的结尾数值,使用默认的PriorityQueue<Integer> heap = new PriorityQueue<>();int max = 0;for (int i = 0; i < lines.length; i++) {// lines[i] -> cur  在黑盒中,把<=cur.start 东西都弹出while (!heap.isEmpty() && heap.peek() <= lines[i].start) {heap.poll();}heap.add(lines[i].end);max = Math.max(max, heap.size());}return max;}public static class Line {public int start;public int end;public Line(int s, int e) {start = s;end = e;}}public static class EndComparator implements Comparator<Line> {@Overridepublic int compare(Line o1, Line o2) {return o1.end - o2.end;}}// for testpublic static int[][] generateLines(int N, int L, int R) {int size = (int) (Math.random() * N) + 1;int[][] ans = new int[size][2];for (int i = 0; i < size; i++) {int a = L + (int) (Math.random() * (R - L + 1));int b = L + (int) (Math.random() * (R - L + 1));if (a == b) {b = a + 1;}ans[i][0] = Math.min(a, b);ans[i][1] = Math.max(a, b);}return ans;}public static class StartComparator implements Comparator<Line> {@Overridepublic int compare(Line o1, Line o2) {return o1.start - o2.start;}}public static void main(String[] args) {Line l1 = new Line(4, 9);Line l2 = new Line(1, 4);Line l3 = new Line(7, 15);Line l4 = new Line(2, 4);Line l5 = new Line(4, 6);Line l6 = new Line(3, 7);// 底层堆结构,heapPriorityQueue<Line> heap = new PriorityQueue<>(new StartComparator());heap.add(l1);heap.add(l2);heap.add(l3);heap.add(l4);heap.add(l5);heap.add(l6);while (!heap.isEmpty()) {Line cur = heap.poll();System.out.println(cur.start + "," + cur.end);}System.out.println("test begin");int N = 100;int L = 0;int R = 200;int testTimes = 200000;for (int i = 0; i < testTimes; i++) {int[][] lines = generateLines(N, L, R);int ans1 = maxCover1(lines);int ans2 = maxCover2(lines);if (ans1 != ans2) {System.out.println("Oops!");}}System.out.println("test end");}
}

leetcode 452. Minimum Number of Arrows to Burst Balloons | 452. 用最少数量的箭引爆气球(左程云:最大线段重合问题)相关推荐

  1. 452 Minimum Number of Arrows to Burst Balloons

    452 Minimum Number of Arrows to Burst Balloons 文章目录 452 Minimum Number of Arrows to Burst Balloons 1 ...

  2. LeetCode 452 Minimum Number of Arrows to Burst Balloons(贪心法)

    问题:给出n个气球,已知其在二维平面中的区间[left,right],箭只能竖直向中,气球重叠时,箭仍然可以穿过.问最少需要多少箭. 思路:贪心算法,根据右端点从小到大排序.在遍历区间时,如果当前区间 ...

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

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

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

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

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

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

  6. 代码随想录35——贪心:860柠檬水找零、406根据身高重建队列、452用最少数量的箭引爆气球

    文章目录 1.860柠檬水找零 1.1.题目 1.2.解答 2.406根据身高重建队列 2.1.题目 2.2.解答 3.452用最少数量的箭引爆气球 3.1.题目 3.2.解答 1.860柠檬水找零 ...

  7. 力扣记录:贪心算法3较难(1)区间问题——55 跳跃游戏,45 跳跃游戏II,452 用最少数量的箭引爆气球,435 无重叠区间,763 划分字母区间,56 合并区间

    本次题目 55 跳跃游戏 45 跳跃游戏II 452 用最少数量的箭引爆气球 435 无重叠区间 763 划分字母区间 56 合并区间 55 跳跃游戏 局部最优:不管每次跳多少步,取最大跳跃步数,若覆 ...

  8. 代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球

    代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球 860.柠檬水找零 406. 根据身高重建队列 452. 用最少数量的箭引爆气球 860. ...

  9. 贪心——区间选点问题(用最少数量的箭引爆气球 Leetcode 452)

    题目选自Leetcode 452 简单的一道贪心题,主要运用排序和贪心的思想~ 我们先看看题目: 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是 ...

最新文章

  1. python装饰器+迭代器+生成器
  2. (二)pycharm上创建虚拟环境--virtualenv
  3. LoRDEC: accurate and efficient long read error correction LoRDEC:精确且高效的长read校正
  4. 55、组播配置实验之PIM Sparse Mode静态指定RP
  5. 别做喷子,多去钻研!
  6. 【Flutter】Image 组件 ( 加载网络图片 | 加载静态图片 | 加载本地图片 | path_provider 插件 )
  7. 技术实践丨如何解决异步接口请求快慢不均导致的数据错误问题?
  8. ext--fileset控件示例
  9. [物理学与PDEs]第1章习题14 求解 rot 方程
  10. PAT (Basic Level) Practice1023 组个最小数
  11. [Bzoj3233][Ahoi2013]找硬币[基础DP]
  12. python fetchall函数_关于python中的查询数据库内容中用到的fetchone()函数和fetchall()函数(转)还有fetchmany()...
  13. PyCharm:Error running xxx: Cannot run program D:\Python27\python.exe
  14. LU分解_SVD分解
  15. 论网站CDN的绕过姿势
  16. 4565: [Haoi2016]字符合并 区间DP
  17. chrome浏览器最新离线版下载 30-72版本全
  18. 移动物联网项目搭建(一)——起步
  19. JAVA 面对对象程序设计 习题7.3
  20. html 微信登陆,登录包含微信登录.html

热门文章

  1. POJ - 1459 Power Network(网络流-最大流)
  2. 蓝桥杯 - 完美的代价(贪心+模拟)
  3. DCN RepPoints解读
  4. Three.js之渲染器
  5. cocos2d-x初探学习笔记(2)--重要概念及Test例子结构
  6. MFC六大核心机制之二:运行时类型识别(RTTI)
  7. 聚美app之 _sign参数分析
  8. Python中的匿名函数和函数式编程
  9. 【线上圆桌 - 263】视频会议终端到终端的加密
  10. 基于主观感兴趣区域的视频编码实践