1. 问题背景与需求分析
今天想和大家分享一道非常经典的贪心算法题目——LeetCode 860题"柠檬水找零"。这道题看似简单,但实际编码时会遇到不少细节问题。我在AC这道题时耗时100ms,排名前10%,下面就把我的解题思路和优化过程完整分享给大家。
题目场景设定非常生活化:你开了一家柠檬水摊,每杯柠檬水售价5美元。顾客排队购买,每次只买一杯,并可能用5美元、10美元或20美元支付。你需要正确找零(注意一开始你手头没有零钱)。如果能给每位顾客正确找零则返回true,否则返回false。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法选择
2.1 问题抽象化
首先我们需要将实际问题抽象为算法问题:
- 输入:一个整数数组bills,表示顾客的支付顺序
- 输出:布尔值,表示是否能正确找零
关键点在于:
- 5美元不需要找零
- 10美元需要找一张5美元
- 20美元优先找10+5的组合(贪心思想),其次考虑5*3
2.2 贪心算法适用性分析
为什么选择贪心算法?因为:
- 局部最优:每次找零时尽可能保留更多5美元(因为5美元更灵活)
- 全局最优:所有局部最优解能保证全局最优
- 无后效性:当前决策不影响后续决策
3. 代码实现与优化
3.1 基础版本实现
python复制def lemonadeChange(bills):
five = ten = 0
for bill in bills:
if bill == 5:
five += 1
elif bill == 10:
if not five:
return False
five -= 1
ten += 1
else: # 20
if ten and five:
ten -= 1
five -= 1
elif five >= 3:
five -= 3
else:
retu
