在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。
一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。
给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。
示例 1:
输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:对于该样例,x = 6 可以射爆 [2,8],[1,6] 两个气球,以及 x = 11 射爆另外两个气球
示例 2:
输入:points = [[1,2],[3,4],[5,6],[7,8]]
输出:4
示例 3:
输入:points = [[1,2],[2,3],[3,4],[4,5]]
输出:2
示例 4:
输入:points = [[1,2]]
输出:1
示例 5:
输入:points = [[2,3],[2,3]]
输出:1
提示:
0 <= points.length <= 104
points[i].length == 2
-231 <= xstart < xend <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons
class Solution(object):
def findMinArrowShots(self, points):
"""
:type points: List[List[int]]
:rtype: int
"""
if points==[]:
return 0
points.sort()
left,right=points[0][0],points[0][1] #以第一个数的左右端点为起止点
arrow=1
for i in points[1::]:
left = i[0]
if left > right:
arrow += 1
right = i[1]
else:
if i[1] < right:
right = i[1]
return arrow
解题思路
我用的start排序,所以先说start排序:主要思路是如果两个区间完全不挨着,那肯定得多用一根箭;如果两个区间挨着就不用多加一根,但3个及以上区间挨着时就一定要注意挨着的这些区间的最小end,如果下一个区间的start大于这个最小end,那即使区间挨着也得多加一根箭。两个区间挨着的话肯定一根箭就够了,3个及以上挨着可就不一定了。
Λ
[-------|]
[----|------] //这俩哥们一个箭够了
[-|---------] //如果第三个是这样的,那一根箭还是够的
| [-------] //如果是这样的呢,不行了,因为这个的start小于第一行那个end了,所以得再加一根
作者:hongyang57
链接:https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons/solution/tan-xin-an-endpai-xu-bi-an-startpai-xu-yao-hao-by-/