代码随想录算法训练营第35天||860.柠檬水找零 、406.根据身高重建队列 、452. 用最少数量的箭引爆气球

文章介绍了使用贪心算法解决LeetCode中的三道问题,包括柠檬水找零、根据身高重建队列和用最少数量的箭引爆气球。关键在于处理特殊情况,如优先使用大面额找零,以及处理重叠区间。通过排序和局部最优策略来优化解决方案。
摘要由CSDN通过智能技术生成

LeetCode 860.柠檬水找零

题目/文章/视频链接860.柠檬水找零

看完代码随想录的想法:

这道题情况少,可以依次单独判断,在第三种情况下可以使用贪心算法,局部最优是优先用10的找零,这样可以拥有更多的5来方便后面的找零

敲代码过程的困难:

分别写对应三种情况的处理对策时,第三种稍微有点复杂,容易马虎

实际代码:

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        five, ten = 0, 0
        for bill in bills:
            if bill == 5:
                five += 1
            elif bill == 10:
                if five < 1: return False
                five -= 1
                ten += 1
            else:
                if ten > 0 and five > 0:
                    ten -= 1
                    five -= 1
                elif five > 2:
                    five -= 3
                else:
                    return False
        return True

LeetCode 406.根据身高重建队列 

题目/文章/视频链接406.根据身高重建队列

看完代码随想录的想法:

这跟之前的分发糖果类似,需要先处理一边后再处理另一边,先按照身高从高到低排序,这样的话处理另一边时就可以直接按照数值直接对应位置插入即可

敲代码过程的困难:

Python中的排序和插入复杂操作运用的还是不太熟练

实际代码:

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
    	# 先按照h维度的身高顺序从高到低排序。确定第一个维度
        # lambda返回的是一个元组:当-x[0](维度h)相同时,再根据x[1](维度k)从小到大排序
        people.sort(key=lambda x: (-x[0], x[1]))
        que = []
	
	# 根据每个元素的第二个维度k,贪心算法,进行插入
        # people已经排序过了:同一高度时k值小的排前面。
        for p in people:
            que.insert(p[1], p)
        return que

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

题目/文章/视频链接452.用最少数量的箭引爆气球

看完代码随想录的想法:

运用了重叠区间的用法,是这道题的关键点,处理好重叠区间后就能实现局部最优

敲代码过程的困难:

Python中的sort复杂操作还需要重复熟练

实际代码:

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if len(points) == 0: return 0
        points.sort(key=lambda x: x[0])
        result = 1
        for i in range(1, len(points)):
            if points[i][0] > points[i - 1][1]: # 气球i和气球i-1不挨着,注意这里不是>=
                result += 1     
            else:
                points[i][1] = min(points[i - 1][1], points[i][1]) # 更新重叠气球最小右边界
        return result

今日收获:

今天学习了经典的贪心算法中的处理一边再处理另一边、重叠区间的用法,贪心算法确实没有明显的规律可循,没有基本套路,今日学习1.5h!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值