《Leetcode of November》452. 用最少数量的箭引爆气球

128 篇文章 0 订阅

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if not points:
            return 0
        points.sort()
        #合并区间
        i=1
        res = [points[0],]
        for point in points:
            if point[0]>res[-1][-1]:
                res.append(point)
            else:
                res[-1] = point[0],min(res[-1][-1],point[1])
        return len(res)

        while i<len(points):
            (l,r),(l1,r1) = points[i-1],points[i]
            if l1<=r:
                #更新新的区间,弹出下个区间
                points[i-1] = l1,min(r,r1)
                points.pop(i)
            else:
                i+=1
        return len(points)

分析:

  • 理解题目本身不是困难的,用最少数量的火箭引爆气球,那也就是让区间尽可能的少就可以了,如果区间够少,那么引爆的气球的箭自然而然也更少了
  • 看到题目提示是贪心算法,基本就想到了区间的合并,不过这个题目的区间合并和之前的区间合并稍微有点不一样
  • 但是基本功就是区间的合并操作

做题:

  • 声明一个空列表,存放合并后的区间
  • 对数组进行升序排序,根据区间左边的大小
  • 将数字第一对区间放到res中,从第二个区间开始去遍历points
  • 操作基本和合并区间一模一样,不过再更新合并后区间的最后一个区间的时候需要注意
  • 最后一个区间的左端点是待比较的右端点,最后一个区间的右端点是待比较的右端点和最后一个区间的右端点,取它们两者的最小值即可

总结:区间合并的一个变形,求两个区间的交集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值