这是悦乐书的第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. MyBatis:Parameter Maps collection does not contain value for 的问题解决

    Result Maps collection does not contain value for   frontpreviewprofitManage.cdata 出现上述错误 主要是因为你的sel ...

  2. MegaPixImage插件代码(new MegaPixImage)

    /** * Mega pixel image rendering library for iOS6 Safari * * Fixes iOS6 Safari's image file renderin ...

  3. Django 视图层和模板层

    目录 一.网站首页和404页面的路由配置 1. 网站首页路由 2. 404页面 二.Django视图层 1. 小白必会三板斧 (1)HttpResponse (2)render (3)redirect ...

  4. collections queue、os、datetime,序列化(json和pickle)模块

    目录 Collections 模块 1.nametuple 2.deque(双端队列) 3.双端队列(deque): 4.Odereddict(有序字典): 5.Defaultdict(默认字典,首字 ...

  5. kafka——分布式的消息队列系统

    总听公司人说kafka kafka... 所以这玩意到底是个啥? 好像是一个高级版的消息队列,什么高吞吐量,数据持久,消息均衡,emmm https://blog.csdn.net/nawenqian ...

  6. python中json对象转换出错解决方法

    今天在使用python中的json转换碰到一个问题: 接收一个post的json字符串: s={"username":"admin","passwor ...

  7. js中[]、{}、()区别

    一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数体 {}表示对象.[]表示对象的属性.方法,()如果用在方法名后面,代表调用 如:var LangShen = {&quo ...

  8. matlab画二维直方图以及双y轴坐标如何修改另一边y轴的颜色

    1.首先讲一下如何用hist画二维直方图 x=[- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  9. java中的浅拷贝和深拷贝

    复制 将一个对象的引用复制给另一个对象,一共有三种方式.第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制. 1.直接赋值 在Java中,A a1 = a2,这实际上复制的是引用,也就是说 ...

  10. 文件的读写过程open read write close

    在python中,读写文件有3个步骤: 调用open()函数,返回一个File对象. 调用File对象的read()或write()方法. 调用File对象的close()方法,关闭该文件. 在读取或 ...