题目链接:https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/
难度:中等

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

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

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

题解

思路:
要想用最少的箭就需要让一支箭尽可能射中更多的气球。
那么我们需要先对数组排序;
若按xstart来排序的话,可能会发生这种情况:[[0, 4], [0, 1], [2, 3]]。第一个区间与第三个区间重合,然而第三个区间与第二个区间不重合。
若按照xend来排序的话,上面的情况就会变成:[[0, 1], [2, 3], [0, 4]]。我们的箭应尽量靠右,才能射中更多的气球。

  1. class Solution:
  2. def findMinArrowShots(self, points: List[List[int]]) -> int:
  3. points.sort(key=lambda x: x[1])
  4. length = len(points)
  5. idx, count = 0, 0
  6. while idx < length:
  7. array = points[idx][1]
  8. idx += 1
  9. while idx < length and points[idx][0] <= array:
  10. idx += 1
  11. count += 1
  12. return count