共计 1218 个字符,预计需要花费 4 分钟才能阅读完成。
一、题目粗心
标签: 贪婪
https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons
有一些球形气球贴在一堵用 XY 立体示意的墙面上。墙面上的气球记录在整数数组 points,其中 points[i] = [xstart, xend] 示意程度直径在 xstart 和 xend 之间的气球。你不晓得气球的确切 y 坐标。
一支弓箭能够沿着 x 轴从不同点 齐全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和完结坐标为 xstart,xend,且满足 xstart ≤ x ≤ xend,则该气球会被 引爆。能够射出的弓箭的数量 没有限度。弓箭一旦被射出之后,能够有限地后退。
给你一个数组 points,返回引爆所有气球所必须射出的 最小 弓箭数。
示例 1:
输出:points = [[10,16],[2,8],[1,6],[7,12]]
输入:2
解释:气球能够用 2 支箭来爆破:
- 在 x = 6 处射出箭,击破气球 [2,8] 和[1,6]。
- 在 x = 11 处发射箭,击破气球 [10,16] 和[7,12]。
示例 2:
输出:points = [[1,2],[3,4],[5,6],[7,8]]
输入:4
解释:每个气球须要射出一支箭,总共须要 4 支箭。
示例 3:
输出:points = [[1,2],[2,3],[3,4],[4,5]]
输入:2
解释:气球能够用 2 支箭来爆破:
- 在 x = 2 处发射箭,击破气球 [1,2] 和[2,3]。
- 在 x = 4 处射出箭,击破气球 [3,4] 和[4,5]。
提醒:
- 1 <= points.length <= 105
- points[i].length == 2
- -231 <= xstart < xend <= 231 – 1
二、解题思路
区间重叠问题,个别都要想到贪婪(部分最优等于全局最优)。本题给咱们一堆大小不等的气球,用区间范畴来示意气球大小,可能会有重叠区间,咱们用起码的箭打爆所有气球。咱们把所有区间依照右边界进行排序,因为每个气球都要被突破,因而排序失去的第一组数据咱们肯定要应用。只有沿着该数据最右边界的地位进行射箭肯定能突破尽可能多的气球。而后顺次挪动射箭的地位,进行统计即可。
三、解题办法
3.1 Java 实现
public class Solution {public int findMinArrowShots(int[][] points) {
// 二维数组的排序??Arrays.sort(points, Comparator.comparingInt(o -> o[1]));
int res = 1;
int end = points[0][1];
for (int i = 1; i < points.length; i++) {if (points[i][0] <= end) {end = Math.min(end, points[i][1]);
} else {
res++;
end = points[i][1];
}
}
return res;
}
}
四、总结小记
- 2022/7/27 复原每日一题