@(labuladong的算法小抄)[贪心]
leetcode 452. 用最少数量的箭引爆气球
题目描述
解题思路
参考:贪心算法之区间调度问题
如果最多有 n 个不重叠的区间,那么就至少需要 n 个箭头穿透所有区间。
只是有一点不一样,在 intervalSchedule 算法中,如果两个区间的边界触碰,不算重叠;而按照这道题目的描述,箭头如果碰到气球的边界气球也会爆炸,所以说相当于区间的边界触碰也算重叠:
此题还要注意数组越界问题
将数组按end升序排列
class Solution {
public int findMinArrowShots(int[][] points) {
if (points.length == 0) return 0;
/* 将数组按end升序排列 */
Arrays.sort(points, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
//不能写成这样:return o1[1] - o2[1],因为有可能越界!
/* 简单理解就是给你两个参数 a(数组的一个元素)、b(a 的后一个元素),如果返回正数表示这两个数需要交换 */
if (o1[1] > o2[1]) {
return 1;
} else if (o1[1] < o2[1]) {
return -1;
} else {
return 0;
}
}
});
/* 表示不重叠区间的数量,初始化为至少有一个区间不重叠 */
int cnt = 1;
/* 初始化为最早结束的end */
int x_end = points[0][1];
for (int[] point : points) {
int start = point[0];
/* 如果发生重叠,直接跳过;如果没有重叠,则更新 */
if (start > x_end) {
x_end = point[1];
/* 找到下一个区间了 */
cnt++;
}
}
return cnt;
}
}