题目:
对于每个气球,提供的输入是水平方向上,纵坐标不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。
一支弓箭可以沿着 x 轴从不同点完全垂直地射出。 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。
已知数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。
思路:
也是区间问题,与435相似,首先排序,以第一个区间的右边界作为对比,如果下一个区间的左边界比它小,则说明用一支箭可以射中两个区间,否则,两个区间是不重叠的,需要两支箭
class Solution(object):
def findMinArrowShots(self, points):
if not points:
return 0
nums = sorted(points, key=lambda x: x[1]) # 按照每一个区间的末尾进行排序
print(nums)
end = nums[0][1] # 第一个区间的末尾作为对比
count = 1 # 至少需要一支箭
for i in range(1,len(nums)):
if nums[i][0]>end:#下一个区间的左侧小于等于当前区间的右侧,则这只箭可以穿过俩,count不加1,两区域
#不重叠时+1
count+=1
end = nums[i][1]
return count
#解法2 和435一样
# for st,en in nums:
# if st > end:#后面区间的start是否大于前面区间的end
# count += 1
# end = en
# return count
#测试
m = Solution()
k = m.findMinArrowShots([[2,3],[7,15],[5,12],[4,5],[8,13],[9,16],[5,8],[8,16],[3,4],[8,17]])
print(k)
运行结果: