leetcode 452. 用最少数量的箭引爆气球 (贪心、集合)

首先可以用贪心算法解决本题:
先判断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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值