0%

leetCode-452:Minimum Number of Arrows to Burst Balloons

问题描述

给定一个区间列表,每个区间表示气球直径的水平起点和终点,气球垂直分布在空间中,假设在某个位置垂直向上发射一支箭,如果箭经过气球所在水平坐标区间,则气球会被戳破。要求找出将所有气球戳破时需要最少的箭的数量。题目链接:**点我**

样例输入输出

输入:[[10,16], [2,8], [1,6], [7,12]]

输出:2

解释:在 2 的位置发射一支箭,可以戳破水平区间 [2, 8]、[1, 6] 的气球,在 10 的位置发射另一支箭,可以戳破 [10, 16]、[7, 12] 的气球

输入:[[1, 2], [2, 3], [3, 4], [4, 5]]

输出:2

解释:在 2 和 4 的位置发射箭

问题解法

将区间进行排序,然后遍历区间,取区间的交集。如果当前区间与上个交集的区间不存在交集的话,则说明需要另外发射一支箭,重新计算新的交集区间了。代码如下

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
class Solution
{
public int findMinArrowShots(int[][] points)
{
if (points == null || points.length == 0)
{
return 0;
}

Arrays.sort(points, Comparator.comparingInt(point -> point[0]));

int prevEnd = points[0][1];
int count = 1;
for (int i = 1; i < points.length; i++)
{
if (points[i][0] < prevEnd)
{
prevEnd = Math.min(prevEnd, points[i][1]);
}
else if (points[i][0] > prevEnd)
{
prevEnd = points[i][1];
count++;
}
}

return count;
}
}