Minimum Number of Arrows to Burst Balloons
Problem Statement
You’re an archer with balloons floating on a 2D plane, each defined by [x, yStart, x, yEnd]. Find the minimum arrows needed to burst all balloons, where an arrow at x bursts all balloons overlapping that x-coordinate. This medium-level greedy problem is about precision—hit as many balloons as possible with each shot!
Example
Input: points = [[10,16],[2,8],[1,6],[7,12]]
Output: 2 (arrows at x=6 and x=12)
Input: points = [[1,2],[3,4],[5,6],[7,8]]
Output: 4 (no overlaps, one arrow per balloon)
Code
Java
Python
JavaScript
public class Solution {
public int findMinArrowShots(int[][] points) {
if (points.length == 0) return 0;
Arrays.sort(points, (a, b) -> Integer.compare(a[1], b[1]));
int arrows = 1;
int end = points[0][1];
for (int i = 1; i < points.length; i++) {
if (points[i][0] > end) {
arrows++;
end = points[i][1];
}
}
return arrows;
}
}
def find_min_arrow_shots(points):
if not points:
return 0
points.sort(key=lambda x: x[1])
arrows = 1
end = points[0][1]
for i in range(1, len(points)):
if points[i][0] > end:
arrows += 1
end = points[i][1]
return arrows
function findMinArrowShots(points) {
if (!points.length) return 0;
points.sort((a, b) => a[1] - b[1]);
let arrows = 1;
let end = points[0][1];
for (let i = 1; i < points.length; i++) {
if (points[i][0] > end) {
arrows++;
end = points[i][1];
}
}
return arrows;
}
Explanation
- Greedy Choice: Sort by end coordinates, shoot at the earliest end to burst overlapping balloons.
- Flow: If a balloon starts after the current end, use a new arrow.
- Example: [[1,6],[2,8],[7,12],[10,16]] → shoot at 6 (bursts 1,2), then 12 (bursts 3,4).
Note
Time complexity: O(n log n) due to sorting, Space complexity: O(1). Aim carefully!
