LeetCode 452 用最少数量的箭引爆气球

题目

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

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

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。

示例 1:

1
2
3
4
5
输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
-在x = 6处射出箭,击破气球[2,8][1,6]
-在x = 11处发射箭,击破气球[10,16][7,12]

示例 2:

1
2
3
输入:points = [[1,2],[3,4],[5,6],[7,8]]
输出:4
解释:每个气球需要射出一支箭,总共需要4支箭。

示例 3:

1
2
3
4
5
输入:points = [[1,2],[2,3],[3,4],[4,5]]
输出:2
解释:气球可以用2支箭来爆破:
- 在x = 2处发射箭,击破气球[1,2][2,3]
- 在x = 4处射出箭,击破气球[3,4][4,5]

思路

我们可以随机射出一支箭,实际上把这支箭使劲往右移指导移到其中一个重叠气球区间的右边界就是箭向右移动的临界值。所以我们只需要先确定一个气球 A的结尾,并加入下一个气球 B,如果新加的气球 A的头大于 B 的尾那么箭就需要再射一支,如果不大于那么就可以一箭双雕。

所以我们首先对气球区间根据气球的结尾进行排序,然后进行上述操作。最终得到结果

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
* @lc app=leetcode.cn id=452 lang=javascript
*
* [452] 用最少数量的箭引爆气球
*/

// @lc code=start
/**
* @param {number[][]} points
* @return {number}
*/
var findMinArrowShots = function (points) {
points.sort(function (a, b) {
return a[1] - b[1];
})
let pos=points[0][1];
let ans=1;
for (let balloon of points) {
console.log("ballon[0] is "+ balloon[0]);
console.log("pos is "+ pos);
if(balloon[0]>pos)
{
pos=balloon[1];
ans++;
}
}
console.log(points);
return ans;

};
// @lc code=end

LeetCode 452 用最少数量的箭引爆气球
http://jack-constantine.github.io/2023/12/24/LeetCode-452-用最少数量的箭引爆气球/
作者
JackConstantine
发布于
2023年12月24日
许可协议