代码随想录第35天 | 贪心算法part4

860 柠檬水找零

创建一个字典记录手里有的5、10、20美元数量,然后依次遍历记录看能否顺利找零
和贪心有什么关系?
收到20美元时优先找10+5,没有才找5+5+5

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        box = {5:0,10:0,20:0}
        for i in range(len(bills)):
            if bills[i] == 5:
                box[5] += 1
            elif bills[i] == 10:
                if box.get(5) == 0:
                    return False
                else:
                    box[5] -= 1
                    box[10] += 1
            elif bills[i] == 20:
                if box.get(10) == 0:
                    if box.get(5) <= 2:
                        return False
                    else:
                        box[5] -= 3
                        box[20] += 1
                elif box.get(10) >= 1:
                    if box.get(5) == 0:
                        return False
                    else:
                        box[5] -= 1
                        box[10] -= 1
                        box[20] += 1
        return True

通过了,不过时间不佳,其实可以直接用数组按顺序存储的,不需要字典//
改成数组反而耗时提高了。。
也不需要数组,直接三个变量会更快。。不过比较简单就不写了

406 根据身高重建队列

简直是我做过最难理解的题。。
首先一堆人站成一列,然后给了一个数组表示每个人的属性,要根据这个重排此数组中元素的顺序,使其与人群所站的顺序一致
属性包括两项,第一身高,第二前面有多少人等于或比他高
首先找到最矮的人,看它前面有几个人,据此就可以确定他们的位置
其次再找次矮的人
逻辑挺绕的,而且需要两个while

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people = sorted(people)
        queue = [0 for i in range(len(people))]
        for p in people:
            index = p[1]
            pos = 0
            n = 0
            while pos < index:
                if queue[n] == 0 or queue[n][0] >= p[0]:
                    pos += 1
                n += 1
            while queue[n] != 0:
                n += 1
            queue[n] = p
            # print(queue)
        return queue

看解答,发现是和我相反的思路,从大到小排,然后直接按照第二个属性插入即可,因为已经保证了前面有高的人,且人数和属性相等,这个逻辑比我要快不少,不用判断插入第几个,写一下试试
耗时降低了一个数量级
list.insert(pos,value) 插入元素使其位于pos所在的索引位置

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

这题有点意思,若两个区间有交集那么只需要交集一支箭可以射穿多个气球
集合覆盖问题
对point数组排序,先看第一个元素再看第二个元素
然后进行连续判断
刚学会的多元素排序函数

points.sort(key=lambda x: (x[0],x[1]))

排序后逐个判断,结果对但是超时了。。
看解答
解答中说,没有必要删除气球,只要记下射箭数量即可,巧妙地利用原数组记录了需要更新的右边边界

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        if len(points) == 0: return 0
        points.sort(key=lambda x: (x[0]))
        L = len(points)
        i = 0
        arrow = 1
        for i in range(1,L):
            if points[i][0]> points[i-1][1]:
                arrow += 1
            else:
                points[i][1] = min(points[i-1][1],points[i][1])
        return arrow
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值