
这道题本质是贪心 区间重叠把能重叠的气球合并成一组一组一箭。Java 实现class Solution {public int findMinArrowShots(int[][] points) {if (points null || points.length 0) {return 0;}// 按右端点升序排序 Arrays.sort(points, (a, b) - Integer.compare(a[1], b[1])); int arrows 1; int arrowPos points[0][1]; // 当前这支箭放在第一个气球的右端点 for (int i 1; i points.length; i) { // 当前气球左端点超过箭的位置说明这支箭射不到它 if (points[i][0] arrowPos) { arrows; arrowPos points[i][1]; // 新箭放在当前气球右端点 } } return arrows; }}为什么按右端点排序更稳按右端点排序后每次把箭放在当前组最靠左的右端点这样能尽可能多地覆盖后面气球。如果用左端点排序也可以但需要额外维护重叠区间的右边界 min(end)。复杂度维度 复杂度时间 O(n log n)排序主导空间 O(log n)排序栈空间面试易错点排序比较器不能写 a[0] - b[0]数据范围接近 Integer.MIN/MAX 时会溢出必须用 Integer.compare。不重叠判断是 不是 [1,2] 和 [2,3] 在 x2 处可以被同一支箭射爆。空数组要先判否则可能越界。这道题和 LeetCode 435 无重叠区间 很像区别在于435 求“最少移除多少个区间”452 求“最少多少支箭”。如果刷完这题可以顺手把 435 一起过掉贪心模式会记得更牢。需要我接着为你讲解 LeetCode 435. 无重叠区间 的 Java 实现吗