[LeetCode] Lemonade Change 买柠檬找零
At a lemonade stand, each lemonade costs `$5`.
Customers are standing in a queue to buy from you, and order one at a time (in the order specified by bills).
Each customer will only buy one lemonade and pay with either a $5, $10, or $20 bill. You must provide the correct change to each customer, so that the net transaction is that the customer pays $5.
Note that you don't have any change in hand at first.
Return true if and only if you can provide every customer with correct change.
Example 1:
Input: [5,5,5,10,20]
Output: true
Explanation:
From the first 3 customers, we collect three $5 bills in order.
From the fourth customer, we collect a $10 bill and give back a $5.
From the fifth customer, we give a $10 bill and a $5 bill.
Since all customers got correct change, we output true.
Example 2:
Input: [5,5,10]
Output: true
Example 3:
Input: [10,10]
Output: false
Example 4:
Input: [5,5,10,10,20]
Output: false
Explanation:
From the first two customers in order, we collect two $5 bills.
For the next two customers in order, we collect a $10 bill and give back a $5 bill.
For the last customer, we can't give change of $15 back because we only have two $10 bills.
Since not every customer received correct change, the answer is false.
Note:
0 <= bills.length <= 10000bills[i]will be either5,10, or20.
这道题说是有很多柠檬,每个卖5刀,顾客可能会提供5刀,10刀,20刀的钞票,我们刚开始的时候并没有零钱,只有收到顾客的5刀,或者 10 刀可以用来给顾客找钱,当然如果第一个顾客就给 10 刀或者 20 刀,那么是无法找零的,这里就问最终是否能够都成功找零。博主最先想到的方法是首先用一个 HashMap 来分别统计出5刀,10 刀,和 20 刀钞票的个数,然后再来统一分析是否能成功找零。由于 10 刀的钞票需要5刀的找零,20 刀的钞票可以用1张 10 刀和1张5刀,或者3张5刀的钞票,所以至少需要1张5刀,那么当前5刀的个数一定不能小于 10 刀和 20 刀的个数之后,否则无法成功找零。由于 20 刀可以用 10 刀来找零,每个 10 刀可以节省两个5刀,但是为了获得每张 10 刀,我们还得付出一张5刀的找零,所以实际上用 10 刀来找零只能省下1张5刀钞票,但是假如 10 刀的个数不够,那么每张 20 刀的钞票还是需要3张5刀的钞票来找零的,所以判断若5刀钞票的个数小于 20 刀钞票个数的三倍减去 10 刀钞票的个数,直接返回 false。for 循环退出后返回 true,参见代码如下:
解法一:
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
unordered_map<int, int> cnt;
for (int bill : bills) {
++cnt[bill];
if (cnt[5] < cnt[20] + cnt[10]) return false;
if (cnt[5] < 3 * cnt[20] - cnt[10]) return false;
}
return true;
}
};
实际上我们并不需要一直保留所有钞票的个数,当某些钞票被当作零钱给了,就没有必要继续留着它们的个数了。其实上我们只关心当前还剩余的5刀和 10 刀钞票的个数,用两个变量 five 和 ten 来记录。然后遍历所有的钞票,假如遇到5刀钞票,则 five 自增1,若遇到 10 刀钞票,则需要找零5刀,则 five 自减1,ten 自增1。否则遇到的就是 20 刀的了,若还有 10 刀的钞票话,就先用 10 刀找零,则 ten 自减1,再用一张5刀找零,five 自减1。若没有 10 刀了,则用三张5刀找零,five 自减3。找零了后检测若此时5刀钞票个数为负数了,则直接返回 false,参见代码如下:
解法二:
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five = 0, ten = 0;
for (int bill : bills) {
if (bill == 5) ++five;
else if (bill == 10) { --five; ++ten; }
else if (ten > 0) { --ten; --five; }
else five -= 3;
if (five < 0) return false;
}
return true;
}
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/860
参考资料:
https://leetcode.com/problems/lemonade-change/
https://leetcode.com/problems/lemonade-change/discuss/143719/C%2B%2BJavaPython-Straight-Forward
[LeetCode All in One 题目讲解汇总(持续更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)
[LeetCode] Lemonade Change 买柠檬找零的更多相关文章
- [LeetCode] Coin Change 2 硬币找零之二
You are given coins of different denominations and a total amount of money. Write a function to comp ...
- [LeetCode] 518. Coin Change 2 硬币找零 2
You are given coins of different denominations and a total amount of money. Write a function to comp ...
- LeetCode – Lemonade Change
At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...
- [LeetCode] 518. Coin Change 2 硬币找零之二
You are given coins of different denominations and a total amount of money. Write a function to comp ...
- LeetCode.860-卖柠檬水找零(Lemonade Change)
这是悦乐书的第331次更新,第355篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第201题(顺位题号是860).在柠檬水摊上,每杯柠檬水的价格为5美元.客户站在队列中向 ...
- [Swift]LeetCode860. 柠檬水找零 | Lemonade Change
At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...
- C#LeetCode刷题之#860-柠檬水找零(Lemonade Change)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4036 访问. 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾 ...
- Leetcode860.Lemonade Change柠檬水找零
在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10 美元或 20 美元.你必须给 ...
- [LeetCode] Coin Change 硬币找零
You are given coins of different denominations and a total amount of money amount. Write a function ...
随机推荐
- 软件测试为什么需要学习Linux的知识?Linux学到什么程度?-log5
软件测试为什么需要学习Linux的知识?学到什么程度?-log5 Dotest软件测试学堂-董浩 公司目前90%的服务器操作系统不是Windows,而是Linux(RedHat.Debian.Cen ...
- 2018-2019-2 20165325 网络对抗技术 Exp4 恶意代码分析
2018-2019-2 20165325 网络对抗技术 Exp4 恶意代码分析 实验内容(概要) 一.系统(联网)运行监控 1. 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,逐步排查并且 ...
- 微信公众号替换title
说明:项目使用 vue 开发 方法一: 单页应用里整个页面只会在第一次完全刷新,后面只会局部刷新(一般不包括head及里面的title),所以无法在服务器端控制title,只能在页面刷新的时候通过js ...
- mathJax基础语法-0基础开始,(这是网上抄来的如果有权限和版权问题联系本人处理,仅供学术参考)
- 2-1、FileBeat入门
FileBeat入门 要开始使用Filebeat设置,请安装并配置相关产品: 用于存储和索引数据的Elasticsearch. 用户界面的Kibana. 用于解析和增强数据的Logstash(可选). ...
- python3 迭代器(Iterator)和生成器(generator)
一.迭代器定义: 迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历位置的对象: 集合数据类型如list.dict.str等是Iterable但不是Iterator,不过可以通过iter()函数获 ...
- Python数据可视化-seaborn库之countplot
在Python数据可视化中,seaborn较好的提供了图形的一些可视化功效. seaborn官方文档见链接:http://seaborn.pydata.org/api.html countplot是s ...
- 同时安装多个的Mysql的实现方法
首写修改my.ini文件 修改这几项即可 [client] port= [mysql] default-character-set=utf8 [mysqld] port= server_id= 全文如 ...
- EF Core 2.2 对多个 DbContext 单个数据库的情况进行迁移的示例
目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 需要注意的情况 场景 在一个项目中,使用了多个 DbContext 且使用同一个数据库的情况 创建新项目 打 ...
- JS全角与半角转化小结
最近在做PC端网站的页面的一个表单校验,需要把全角输入转化成半角符号.之前没有了解过这些编码的知识,还是得Google一下查查资料,故简单总结一下. 什么是全角.半角 传统上,英语或拉丁字母语言使用的 ...