news 2026/4/23 7:48:25

算法题 柠檬水找零

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法题 柠檬水找零

860. 柠檬水找零

问题描述

在柠檬水摊上,每一杯柠檬水售价5 美元

顾客排队购买,每位顾客只买一杯,支付的金额可能是5、10 或 20 美元

你最初没有任何零钱。你需要给每位顾客正确找零,使得净交易是每位顾客向你支付 5 美元。

注意:一开始你没有任何零钱。

返回true如果你能给每位顾客正确找零,否则返回false

示例

输入:[5,5,5,10,20]输出:true解释:-前三位顾客支付5美元,无需找零-第四位顾客支付10美元,找零5美元-第五位顾客支付20美元,找零15美元(一张10美元+一张5美元)
输入:[5,5,10,10,20]输出:false解释:-前两位顾客支付5美元-第三位顾客支付10美元,找零5美元-第四位顾客支付10美元,找零5美元-第五位顾客支付20美元,需要找零15美元,但只剩25美元(10美元),无法找零
输入:[5,5,10]输出:true

算法思路

贪心算法

  1. 核心

    • 5美元:无需找零,直接收下
    • 10美元:必须找零5美元
    • 20美元:需要找零15美元,有两种方式:
      • 一张10美元 + 一张5美元(优先选择)
      • 三张5美元
  2. 贪心策略

    • 对于20美元的找零,优先使用10美元,保留更多的5美元
    • 5美元的用途更广(可以找零10美元和20美元),而10美元只能用于找零20美元
  3. 状态

    • 只需要记录当前拥有的5美元10美元的数量
    • 20美元不需要记录,因为无法用于找零

代码实现

方法一:贪心

classSolution{/** * 判断是否能给所有顾客正确找零 * 使用贪心:优先使用10美元找零20美元 * * @param bills 顾客支付的账单数组,每个元素为5、10或20 * @return 如果能正确找零返回true,否则返回false */publicbooleanlemonadeChange(int[]bills){intfive=0;// 5美元的数量intten=0;// 10美元的数量for(intbill:bills){if(bill==5){// 收到5美元,无需找零five++;}elseif(bill==10){// 收到10美元,需要找零5美元if(five>0){five--;ten++;}else{// 没有5美元找零returnfalse;}}else{// bill == 20// 收到20美元,需要找零15美元// 优先使用10+5的组合(贪心策略)if(ten>0&&five>0){ten--;five--;}elseif(five>=3){// 使用5+5+5的组合five-=3;}else{// 无法找零returnfalse;}}}returntrue;}}

算法分析

  • 时间复杂度:O(n)
    • n 是顾客数量(bills数组长度)
    • 每位顾客只需要O(1)时间处理
  • 空间复杂度:O(1)
    • 只使用了两个整数变量记录零钱数量

算法过程

1:bills = [5,5,5,10,20]

  1. 顾客1(5美元)five=1, ten=0
  2. 顾客2(5美元)five=2, ten=0
  3. 顾客3(5美元)five=3, ten=0
  4. 顾客4(10美元):有5美元,five=2, ten=1
  5. 顾客5(20美元):有10美元和5美元,使用10+5组合,five=1, ten=0
  6. 结果true

2:bills = [5,5,10,10,20]

  1. 顾客1(5美元)five=1, ten=0
  2. 顾客2(5美元)five=2, ten=0
  3. 顾客3(10美元)five=1, ten=1
  4. 顾客4(10美元)five=0, ten=2
  5. 顾客5(20美元)
    • 尝试10+5:有10美元但没有5美元
    • 尝试5+5+5:只有0张5美元 < 3
  6. 结果false

测试用例

publicclassMain{publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:标准成功案例int[]bills1={5,5,5,10,20};System.out.println("Test 1: "+solution.lemonadeChange(bills1));// true// 测试用例2:找零失败int[]bills2={5,5,10,10,20};System.out.println("Test 2: "+solution.lemonadeChange(bills2));// false// 测试用例3:简单成功int[]bills3={5,5,10};System.out.println("Test 3: "+solution.lemonadeChange(bills3));// true// 测试用例4:只有5美元int[]bills4={5,5,5,5,5};System.out.println("Test 4: "+solution.lemonadeChange(bills4));// true// 测试用例5:第一个顾客付10美元int[]bills5={10,10};System.out.println("Test 5: "+solution.lemonadeChange(bills5));// false// 测试用例6:第一个顾客付20美元int[]bills6={20};System.out.println("Test 6: "+solution.lemonadeChange(bills6));// false// 测试用例7:复杂成功案例int[]bills7={5,5,10,20,5,5,5,5,5,5};System.out.println("Test 7: "+solution.lemonadeChange(bills7));// true// 测试用例8:边界情况 - 空数组int[]bills8={};System.out.println("Test 8: "+solution.lemonadeChange(bills8));// true// 测试用例9:单个5美元int[]bills9={5};System.out.println("Test 9: "+solution.lemonadeChange(bills9));// true// 测试用例10:全部20美元int[]bills10={20,20,20};System.out.println("Test 10: "+solution.lemonadeChange(bills10));// false// 测试用例11:贪心策略int[]bills11={5,5,5,5,10,20};System.out.println("Test 11: "+solution.lemonadeChange(bills11));// true// 如果错误地使用5+5+5找零20美元,会导致后续无法找零10美元// 贪心策略会保留5美元// 测试用例12:大量5美元int[]bills12=newint[10000];Arrays.fill(bills12,5);System.out.println("Test 12: "+solution.lemonadeChange(bills12));// true}}

关键点

  1. 贪心策略

    • 5美元比10美元更有价值
    • 优先消耗10美元,保留5美元
  2. 状态

    • 只需要跟踪5美元和10美元的数量
    • 20美元无法用于找零,无需跟踪
  3. 边界条件处理

    • 空数组:返回true(没有顾客需要服务)
    • 第一个顾客付10或20美元:无法找零,返回false

常见问题

  1. 为什么不用考虑20美元的数量?
    20美元无法用于找零(只有5、10、20三种面额,20美元太大了),所以收到20美元后直接留在手里,不影响后续找零。

  2. 贪心策略是否是最优的?
    5美元的灵活性更高,保留更多5美元永远不会比消耗5美元更差。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 20:13:05

机器人运动规划实战突破:3步解决工业场景中的复杂运动难题

机器人运动规划在工业自动化中面临着诸多挑战&#xff1a;如何平衡效率与精度&#xff1f;如何应对复杂环境中的避障需求&#xff1f;本文将通过3步配置法&#xff0c;带你突破传统规划的瓶颈&#xff0c;实现高效可靠的工业机器人运动控制。 【免费下载链接】moveit2 :robot: …

作者头像 李华
网站建设 2026/4/20 11:22:40

海尔智能设备无缝接入HomeAssistant:3步搞定全屋智能联动

海尔智能设备无缝接入HomeAssistant&#xff1a;3步搞定全屋智能联动 【免费下载链接】haier 项目地址: https://gitcode.com/gh_mirrors/ha/haier 你是否曾经为不同品牌智能设备无法协同工作而烦恼&#xff1f;每次控制海尔空调、热水器都要打开单独的APP&#xff0c;…

作者头像 李华
网站建设 2026/4/20 13:19:54

实战GPU加速视频处理:5步快速上手高性能编码方案

实战GPU加速视频处理&#xff1a;5步快速上手高性能编码方案 【免费下载链接】hap-qt-codec A QuickTime codec for Hap video 项目地址: https://gitcode.com/gh_mirrors/ha/hap-qt-codec GPU加速视频处理技术正在彻底改变传统视频编解码的工作方式。Hap QuickTime编解…

作者头像 李华
网站建设 2026/4/20 13:18:47

海尔HomeAssistant终极整合指南:告别设备孤岛,实现全屋智能联动

海尔HomeAssistant终极整合指南&#xff1a;告别设备孤岛&#xff0c;实现全屋智能联动 【免费下载链接】haier 项目地址: https://gitcode.com/gh_mirrors/ha/haier 还在为家里的海尔智能设备无法与其他品牌设备联动而烦恼吗&#xff1f;看着空调、冰箱、洗衣机各自为…

作者头像 李华
网站建设 2026/4/20 13:18:47

【AI自动编程革命】:Open-AutoGLM开发团队首次公开核心技术路径

第一章&#xff1a;Open-AutoGLM是那个团队开发的Open-AutoGLM 是由智谱AI&#xff08;Zhipu AI&#xff09;研发团队推出的一款开源自动化语言模型系统。该模型基于 GLM 架构&#xff0c;专注于提升大模型在复杂任务中的自主规划与执行能力。智谱AI作为国内领先的人工智能研究…

作者头像 李华
网站建设 2026/4/18 21:48:08

自考必备10个降AI率工具,高效避坑指南!

自考必备10个降AI率工具&#xff0c;高效避坑指南&#xff01; AI降重工具&#xff1a;自考论文的“隐形助手” 随着人工智能技术的不断发展&#xff0c;越来越多的自考生在撰写论文时开始依赖AI工具来提升效率。然而&#xff0c;AI生成的内容往往存在明显的“痕迹”&#xff0…

作者头像 李华