【LeetCode】452 and 1154

452. 用最少数量的箭引爆气球

在这里插入图片描述
解法:排序+贪心
对于某个气球,沿着其右边界射箭,能够尽可能射中最多的气球,所有左边界小于其右边界的均被射中。因此想要求最小弓箭数,即找到数组中最少非重叠子区间数。求解方式如下:
1、先对数组按右边界升序排序。
2、维护指针pos,用于表明当前子区间右边界,初始为point[0][1]。
3、遍历数组,若左边界小于等pos,则区间之间相互重叠,可用一支箭射中,若左边界大于pos,则为新的子区间,更新pos为point[i][1],弓箭数量+1.
贪心的思想是每次取右边界,目的尽可能囊括更多的重叠区间,在这样的贪心策略下(由局部最优(如果当前射出最右侧的箭都不能解决某个气球,才需要一支新的箭)找到全局最优),最终会得到最少的弓箭数。

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if not points:
            return 0
        
        points.sort(key=lambda balloon: balloon[1])
        pos = points[0][1]
        ans = 1
        # print(points)
        for balloon in points:
            if balloon[0] > pos:
                pos = balloon[1]
                ans += 1
        
        return ans

1154. 一年中的第几天

在这里插入图片描述
解法:逻辑计算
这题核心是了解每月有多少天,以及对特殊情况"闰年"的判断。

class Solution:
    def dayOfYear(self, date: str) -> int:
        year, month, day = [int(x) for x in date.split("-")]

        amount = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
            amount[1] += 1

        ans = sum(amount[:month - 1])
        return ans + day
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值