这是悦乐书的第331次更新,第355篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第201题(顺位题号是860)。在柠檬水摊上,每杯柠檬水的价格为5美元。客户站在队列中向您购买,一次只买一杯(按照账单数组指定的顺序)。

每位顾客只会购买一瓶柠檬水,并以5美元,10美元或20美元的钞票付款。您必须向每个客户提供正确的找零,以便净交易是客户支付5美元。请注意,您最初没有任何零钱。当且仅当您能为每位客户提供正确的找零时,才返回true。例如:



输入:[5,5,5,10,20]

输出:true

说明:

从前3位客户,我们按顺序收取3张5美元的钞票。

从第四位客户那里,我们收取10美元的钞票并找零5美元。

从第五位客户那里,我们收取10美元的钞票并找零5美元。

由于所有客户都得到了正确的找零,我们输出true。



输入:[5,5,10]

输出:true



输入:[10,10]

输出:false



输入:[5,5,10,10,20]

输出:false

说明:

从前两位客户订购,我们收取两张5美元的钞票。

对于接下来的两个客户,我们收取10美元的钞票并找零5美元。

对于最后一位客户,我们不能给予15美元的找零,因为我们只有两张10美元的钞票。

由于并非每个客户都收到正确的更改,因此返回false。



注意

  • 0 <= bills.length <= 10000
  • bills[i]将是5,10或20。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

这是一个找零的问题。每杯柠檬水5块钱,顾客会用5块、10块、20块三种面值的钱购买柠檬水,顾客支付10块时,需要找零钱5块,如果是20块的,就需要找零钱15块,从而保证每笔交易都是5块。也就是说遇到大面值的钱时,你要有足够的小面值钱找零,找不出来就直接返回false。

我们只需要记录5块和10块面值的钱有多少即可。

收到5块时,5块的数量加1。

收到10块时,10块的数量加1,5块的数量减1(找给顾客5块)。

收到20块时,此时需要考虑两种不同的找零方式:

  1. 找给顾客一张10块的和一张5块的。
  2. 找给顾客3张5块的。

每进行一次交易,我们都需要检查一次5块钱和10块钱的数量,如果减少到为负数,说明不能正常进行下一次交易了,直接返回false。最后返回true。

此解法的时间复杂度是O(N),空间复杂度是O(1)。

public boolean lemonadeChange(int[] bills) {
int n = bills.length;
int count5 = 0, count10 = 0;
for (int bill : bills) {
if (bill == 5) {
count5++;
} else if (bill == 10) {
count10++;
count5--;
} else if (bill == 20) {
if (count10 == 0 && count5 >= 0) {
count5 -= 3;
} else {
count10--;
count5--;
}
}
if (count5 < 0 || count10 < 0) {
return false;
}
}
return count5 >= 0 && count10 >= 0;
}

03 第二种解法

使用递归的方式。

针对上面的解法,同样的思路,也可以利用递归的方式来解,判断的条件依旧。

此解法的时间复杂度是O(N),空间复杂度是O(1)。

public boolean lemonadeChange(int[] bills) {
return helper(bills, 0, 0, 0);
} public boolean helper(int[] bills, int i, int five, int ten){
if (i == bills.length) {
return true;
}
if (bills[i] == 5) {
return helper(bills, i+1, five+1, ten);
}
// 此处需要判断5块的数量是否大于0
if (bills[i] == 10) {
return five > 0 && helper(bills, i+1, five-1, ten+1);
}
if (ten > 0 && five > 0 ) {
return helper(bills, i+1, five-1, ten-1);
} else if (five >= 3) {
return helper(bills, i+1, five-3, ten);
} else {
return false;
}
}

04 小结

算法专题目前已连续日更超过五个月,算法题文章201+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.860-卖柠檬水找零(Lemonade Change)的更多相关文章

  1. [Swift]LeetCode860. 柠檬水找零 | Lemonade Change

    At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...

  2. LeetCode:柠檬水找零【860】

    LeetCode:柠檬水找零[860] 题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向 ...

  3. Leetcode 860. 柠檬水找零

    860. 柠檬水找零  显示英文描述 我的提交返回竞赛   用户通过次数187 用户尝试次数211 通过次数195 提交次数437 题目难度Easy 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾 ...

  4. 【LeetCode】860. 柠檬水找零

    860. 柠檬水找零 知识点:贪心 题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 ...

  5. LeetCode 860.柠檬水找零(C++)

    在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须给 ...

  6. LeetCode 860. 柠檬水找零 (贪心)

    在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须给 ...

  7. Leetcode860.Lemonade Change柠檬水找零

    在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须给 ...

  8. [LeetCode] 860. 柠檬水找零 lemonade-change(贪心算法)

    思路: 收到5块时,只是添加:收到十块时,添加10块,删除一个5块:收到20块时,添加20,删除一个10块一个5块,或者直接删除3个5块(注意:这里先删除5+10优于3个5) class Soluti ...

  9. [USACO13NOV]没有找零No Change [TPLY]

    [USACO13NOV]没有找零No Change 题目链接 https://www.luogu.org/problemnew/show/3092 做题背景 FJ不是一个合格的消费者,不知法懂法用法, ...

随机推荐

  1. HTTP/1.1-HTTP/2.0-HTTP/3.0-HTTPS

    HTTP/1.1 网上关于HTTP/1.1的讨论多是基于RFC2616文档,而IETF已更新了HTTP/1.1并将其分为六个部分,使协议变得更简单易懂,对老版本RFC2616中模糊不清的部分做了解释 ...

  2. DB2常用指令

    1. 启动实例(db2inst1): db2start 2. 停止实例(db2inst1): db2stop 3. 列出所有实例(db2inst1) db2ilist 3-1.列出当前实例: db2 ...

  3. C++ fstream 用法

    #include <fstream> #include <iostream> main() { int a,b,c,d; std::ifstream infile (" ...

  4. 查看是否安装jdk及路径

    JDK能否曾经装置,可以在cmd窗口里输出java -version,假定没有提示出错,就表示曾经装置. JDK的装置途径,可以输出java -verbose,会前往很多信息,其中就包括了JDK的装置 ...

  5. python4---打印长方形

    1:方法1for i in range(6): for j in range(3): print("*", end=" ") print() 2:输入显示长方形 ...

  6. linux-包管理器-4

    安装 升级 查询 导入公钥 rpm -K|checksig rpmfile 检查包的完整性和签名 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 ...

  7. C#之扩展方法 default(T)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. jquery last 选择器 语法

    jquery last 选择器 语法 作用: :last 选择器选取最后一个元素.最常见的用法:与其他元素一起使用,选取指定组合中的最后一个元素(就像上面的例子). 语法:$(":last& ...

  9. Qt新建工程

    1.基本步骤 (1)Qt Quick Project是开发QML语言的: (2)Qt Widget Project是基于部件的开发,一种是PC的Qt Gui Application,一种是手机的Mob ...

  10. JS常用正则表达式验证

    一.电话+手机 重点是正则表达式: var myreg=/^[1][3,4,5,7,8][0-9]{9}$/; 表达式的意思是: 1--以1为开头: 2--第二位可为3,4,5,7,8,中的任意一位: ...