题目描述
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。
顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
注意,一开始你手头没有任何零钱。
如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
示例 1:
输入:[5,5,5,10,20]
输出:true
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出 true。
示例 2:输入:[5,5,10]
输出:true
示例 3:输入:[10,10]
输出:false
示例 4:输入:[5,5,10,10,20]
输出:false
解释:
前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。
对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
由于不是每位顾客都得到了正确的找零,所以答案是 false。提示:
0 <= bills.length <= 10000
bills[i] 不是 5 就是 10 或是 20
解题思路:用map记录5,10,20(20可不记录)的数量,遍历数组的时候遇见5就累计,遇见10就判断是否有5,没用则返回false有则5减1,遇见20优先选择一个10一个5的方式,没用则三个5,都没有则返回flase
func lemonadeChange(bills []int) bool {
var changeMape = map[int]int{
5:0,
10:0,
20:0,
}
for _,v :=range bills{
changeMape[v]++
if v == 10 && changeMape[5] != 0{
changeMape[5]--
}else if v==10{
return false
break
}
if v == 20{
if changeMape[10] != 0 && changeMape[5] != 0 {
changeMape[5]--
changeMape[10]--
}else if changeMape[5] >=3{
changeMape[5]=changeMape[5]-3
}else{
return false
break
}
}
}
return true
}
官方思路:基本相似,用两个数记录5,10的数量
func lemonadeChange(bills []int) bool {
five, ten := 0, 0
for _, bill := range bills {
if bill == 5 {
five++
} else if bill == 10 {
if five == 0 {
return false
}
five--
ten++
} else {
if five > 0 && ten > 0 {
five--
ten--
} else if five >= 3 {
five -= 3
} else {
return false
}
}
}
return true
}
复杂度分析
时间复杂度:O(N),其中 NN 是bills 的长度。
空间复杂度:O(1)。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/lemonade-change/solution/ning-meng-shui-zhao-ling-by-leetcode-sol-nvp7/