leetcode452_用最少的箭射气球(python)

题目:

对于每个气球,提供的输入是水平方向上,纵坐标不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。

一支弓箭可以沿着 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)

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值