题目描述:
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points
,其中points[i] = [xstart, xend]
表示水平直径在 xstart
和 xend
之间的气球。你不知道气球的确切 y 坐标。
一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x
处射出一支箭,若有一个气球的直径的开始和结束坐标为 x
start
,x
end
, 且满足 xstart ≤ x ≤ x
end
,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。
给你一个数组 points
,返回引爆所有气球所必须射出的 最小 弓箭数 。
示例 1:
输入:points = [[10,16],[2,8],[1,6],[7,12]] 输出:2 解释:气球可以用2支箭来爆破: -在x = 6处射出箭,击破气球[2,8]和[1,6]。 -在x = 11处发射箭,击破气球[10,16]和[7,12]。
示例 2:
输入:points = [[1,2],[3,4],[5,6],[7,8]] 输出:4 解释:每个气球需要射出一支箭,总共需要4支箭。
示例 3:
输入:points = [[1,2],[2,3],[3,4],[4,5]] 输出:2 解释:气球可以用2支箭来爆破: - 在x = 2处发射箭,击破气球[1,2]和[2,3]。 - 在x = 4处射出箭,击破气球[3,4]和[4,5]。
提示:
1 <= points.length <= 105
points[i].length == 2
-231 <= xstart < xend <= 231 - 1
我的作答:
思路是先按照左边界排序,如果某个元素的左边界和上一个元素的右边界完全没有重合,说明需要一支新的箭,否则如果有重合,则更新当前元素的右边界为上一个元素右边界和这个元素右边界的最小值,这样做可以判断是否和下一个元素的左边界重合,即判断射当前气球和上一个气球的箭能不能射下一个气球。。。不断叠加。。
class Solution(object):
def findMinArrowShots(self, points):
"""
:type points: List[List[int]]
:rtype: int
"""
if len(points)==0:
return 0
points.sort(key=lambda x:(x[0], x[1]))
result = 1
for i in range(1, len(points)):
if points[i][0]>points[i-1][1]:
result += 1
else: #更新右边边界
points[i][1] = min(points[i][1], points[i-1][1])
return result
参考:
设置阈值的方式
class Solution(object):
def findMinArrowShots(self, points):
"""
:type points: List[List[int]]
:rtype: int
"""
if len(points) == 0:
return 0
points.sort(key = lambda x: x[0])
# points已经按照第一个坐标正序排列,因此只需要设置一个变量,记录右侧坐标(阈值)
# 考虑一个气球范围包含两个不相交气球的情况:气球1: [1, 10], 气球2: [2, 5], 气球3: [6, 10]
curr_min_right = points[0][1]
count = 1
for i in points:
if i[0] > curr_min_right:
# 当气球左侧大于这个阈值,那么一定就需要再发射一只箭,并且将阈值更新为当前气球的右侧
count += 1
curr_min_right = i[1]
else:
# 否则的话,我们只需要求阈值和当前气球的右侧的较小值来更新阈值
curr_min_right = min(curr_min_right, i[1])
return count
标签:right,curr,阈值,min,随想录,points,92,气球,刷题 From: https://blog.csdn.net/Aerochacha/article/details/144987742