代码随想录学习Day 30

860.柠檬水找零

题目链接

讲解链接

思路:需要找零的情况是顾客支付10元或20元,尤其是支付20元时需要考虑找零的方式,此时可以选择找零3张5元或者一张10元+一张5元,按照贪心算法的思路来看:

局部最优:在找零20元时尽量采用10+5的方式,多保留5元,因为5元能够找零的情况更多;

全局最优:每次找零尽可能多的保留5元从而为更多的顾客找零。

找到贪心的思路后其余部分实现就比较简单了。用一个字典来统计当前手中的钞票,每次找零时将消耗的钞票-1,如果当前钞票不满足找零条件则返回False,循环结束返回True。

python 复制代码
class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        if bills[0] > 5:  # 第一个就大于5无法找零,直接返回
            return False
        money = {5:0, 10:0, 20:0}  # 初始手中没钱
        for i in range(len(bills)):  # 遍历账单数组
            money[bills[i]] = money.get(bills[i], 0) + 1  # 每次将收到的钱在字典中对应位置+1
            if bills[i] == 5:  # 等于5则不需要找零
                continue
            elif bills[i] == 10:  # 等于10需要用一张5元来找零
                if money[5] > 0:  # 当前手中有5元
                    money[5] -= 1  # 5元钞票的数量-1
                    continue
                else:
                    return False
            elif bills[i] == 20:  # 需要用3张5元或者1张10元和一张5元来找零
                if money[5] >= 1 and money[10] >= 1:  # 优先考虑后者,因为要尽量多保留5元
                    money[5] -= 1
                    money[10] -= 1
                elif money[5] >= 3:  # 在没有10+5的情况下才考虑3*5
                    money[5] -= 3
                    continue
                else:
                    return False
        return True  # 循环结束则返回True

406.根据身高重建队列

题目链接

讲解链接

思路:先对所有人按照身高从大到小进行排序,身高相同的话则k小的站前面,接下来以k为下标插入队列即可。因为按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

全局最优:最后都做完插入操作,整个队列满足题目队列属性

python 复制代码
class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        people.sort(key=lambda x: (-x[0], x[1]))  # 先按照身高降序排序,在按照k值从小到大排序
        queue = []
        for p in people:  # 按照k值进行插入
            queue.insert(p[1], p)  # people已经排序过了,同一高度时k值小的排前面
        return queue

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

题目链接

讲解链接

局部最优:当气球出现重叠,一起射,所用弓箭最少。

全局最优:把所有气球射爆所用弓箭最少。

为了让气球尽可能的重叠,需要对数组进行排序。按照起始位置排序,那么就从前向后遍历气球数组,靠左尽可能让气球重复。从前向后遍历遇到重叠的气球,重叠气球中右边边界的最小值之前的区间一定需要一支箭。可以看出首先第一组重叠气球,一定需要一支箭。而气球3的左边界大于第一组重叠气球的最小右边界,所以再需要一支箭来射气球3。

python 复制代码
class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        points.sort(key=lambda x: x[0])  # 将所有气球按照左端点排序
        left, right = points[0][0],points[0][1]  # 初始化左右边界值为第一个气球的左右端点
        count = 1  # 统计需要箭的数量,初始为1
        for i in points:  # 遍历气球数组
            if i[0] > right:  # 如果当前气球的左端点大于右边界值,说明不能只用一支箭将其与前面的气球引爆,消耗箭矢的数量+1
                count += 1
                left, right = i[0], i[1]  # 更新当前的左右边界,为该气球的左右端点
            else:  # 如果不符合上面的条件,则说明可以用一支箭将该气球与之前的气球引爆
                left = max(left, i[0])  # 更新左边界,取区间的交集
                right = min(right, i[1])  # 同上取交集更新右边界
        return count
相关推荐
WBluuue39 分钟前
数学建模:智能优化算法
python·机器学习·数学建模·爬山算法·启发式算法·聚类·模拟退火算法
焄塰1 小时前
Ansible 管理变量和事实
学习·centos·ansible
赴3351 小时前
矿物分类案列 (一)六种方法对数据的填充
人工智能·python·机器学习·分类·数据挖掘·sklearn·矿物分类
大模型真好玩1 小时前
一文深度解析OpenAI近期发布系列大模型:意欲一统大模型江湖?
人工智能·python·mcp
RPA+AI十二工作室1 小时前
亚马逊店铺绩效巡检_影刀RPA源码解读
chrome·python·rpa·影刀
oe10192 小时前
读From GPT-2 to gpt-oss: Analyzing the Architectural Advances(续)
笔记·gpt·学习
小艳加油2 小时前
Python机器学习与深度学习;Transformer模型/注意力机制/目标检测/语义分割/图神经网络/强化学习/生成式模型/自监督学习/物理信息神经网络等
python·深度学习·机器学习·transformer
学行库小秘4 小时前
ANN神经网络回归预测模型
人工智能·python·深度学习·神经网络·算法·机器学习·回归
Yn3124 小时前
在 Python 中使用 json 模块的完整指南
开发语言·python·json
秋难降4 小时前
线段树的深度解析(最长递增子序列类解题步骤)
数据结构·python·算法