【go】860_柠檬水找零

32 篇文章 0 订阅

题目描述

在柠檬水摊上,每一杯柠檬水的售价为 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值