首先可以用贪心算法解决本题:
先判断points是不是空,若为空则返回0
然后按照横坐标的右极限排序
之后以第0位的右极限为position
则所有左极限在position内的balloon都可以被射爆
判断之后的左极限,若左极限比position大则position换为新的右极限
箭数+=1
重复上述判断过程
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if len(points) == 0:
return 0
points.sort(key = lambda a: a[1])
position = points[0][1]
res = 1
for i in range(0, len(points)):
if points[i][0] > position:
position = points[i][1]
res += 1
return res
第二种是集合法:
先按照左极限进行排序
以第0位的两个极限为准
如果后面的左极限是在两个极限之间,
则新集合是在两个集合里
同时右极限变为两个极限中更小的那个
左极限是按照顺序排序的则直接换成新极限的左极限
则集合变为更小的那个集合
如果集合不是在原集合内
则箭数+=1且换成position新的集合重复上述过程
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if len(points) == 0:
return 0
points.sort(key=lambda a: a[0])
positon = points[0]
res = 1
for balloon in points[1:]:
if positon[0] <= balloon[0] <= positon[1]:
positon[0] = balloon[0]
positon[1] = min(balloon[1], positon[1])
else:
positon = balloon
res += 1
return res