这是悦乐书的第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. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  2. Access数据库删除重复记录,只保留一条记录的做法

    Access数据库删除重复记录,只保留一条记录的做法: 只保留id最小的记录方法: delete from [表名] where id not in (select min(id) from [表名] ...

  3. java高并发核心要点|系列1|开篇

    在java高并发编程,有几个很重要的内容: 1.CAS算法 2.CPU重排序 3.缓存行伪共享 我们先来说说高并发世界中的主要关键问题是什么? 是数据共享. 因为多线程之间要共享数据,就会遇到各种问题 ...

  4. 炸弹:线段树优化建边+tarjan缩点+建反边+跑拓扑

    这道题我做了有半个月了...终于A了... 有图为证 一句话题解:二分LR线段树优化建边+tarjan缩点+建反边+跑拓扑统计答案 首先我们根据题意,判断出来要炸弹可以连着炸,就是这个炸弹能炸到的可以 ...

  5. Python之面向对象之单例模式的四种方式

    一.内容 保证一个类只有一个实例,并提供一个访问它的全局访问点 二.角色 单利 三.使用场景 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时 比如:数据库链接.Socket创建链接 四.优 ...

  6. Google为远程入侵Titan M芯片提供最高150万美元的赏金

    Google最近发布了一项新的公告,旨在提高对发现和报告Android操作系统中的严重漏洞的漏洞赏金的奖励,Google昨天为黑客设定了新的挑战性水平,使他们可以赢得高达150万美元的赏金. 从今天开 ...

  7. vs2017 mvc 启动时经常出现调用的目标发生异常

    1.vs  2017 调试web 程序时老是出现调用的目标发生异常 本人眼拙,基本上看了网站说的一些方法,设置环境变量是无效的,只有一个办法,卸载重装. 1.0 卸载过程 打开计算机-卸载或更改软件- ...

  8. NOIP2016提高A组模拟9.17总结

    第一题,典型的隔板问题, 但是我忘记隔板问题怎么打,一开始在花了1小时,还是没想出来,果断弃疗, 最后的40分钟,我打完了第二题,接着又用了20分钟推敲出一种极其猥琐的式子来代替,可惜预处理的阶乘忘记 ...

  9. java——AtomicInteger 中 incrementAndGet与getAndIncrement 两个方法的区别

    https://blog.csdn.net/chenkaibsw/article/details/81031950 源码: getAndIncrement: public final int getA ...

  10. 【leetcode】1201. Ugly Number III

    题目如下: Write a program to find the n-th ugly number. Ugly numbers are positive integers which are div ...