860. 柠檬水找零『简单』

题目来源于力扣(LeetCode

一、题目

860. 柠檬水找零

题目相关标签:贪心算法

提示:

  • 0 <= bills.length <= 10000
  • bills[i] 不是 5 就是 10 或是 20

二、解题思路

  1. 该题可以用现实生活中的方式来完成模拟,即模拟情景,再用代码的方式表现出现即可

  2. 定义两个变量用于记录 5 元及 10 元钞票出现的次数

  3. 当出现 10 元时,判断是否最少有一个 5 元存在,即记录 5 元钞票的变量大于 0

  4. 当出现 20 元时,有 1 张 10 元加 1 张 5 元找零,3 张 5 元找零的两种方式

  5. 那么采用贪心法的思想,优先使用 1 张 10 元加 1 张 5 元找零方式,当条件不满足时,再考虑 3 张 5 元找零的方式,均不满足时,说明无法进行找零,return false

    因为 5 元钞票可以组成 10 元钞票,而 10 元钞票无法组成 5 元钞票

三、代码实现

public static boolean lemonadeChange(int[] bills) {
    int five = 0;  // 记录 5 元出现的次数
    int ten = 0;  // 记录 10 元出现的次数
    // 排除特殊情况:数组长度为零时
    if (bills.length == 0) {
        return true;
    }
    // 排除特殊情况:数组首位不为 5 时
    if (bills[0] == 10 || bills[0] == 20) {
        return false;
    }

    for (int i = 0; i < bills.length; i++) {
        if (bills[i] == 5) {
            five ++;
        } else if (bills[i] == 10) {
            // 对 10 元找零
            if (five == 0) {
                return false;
            }
            // 5 元加 1,10 元减 1
            five --;
            ten ++;
        } else {
            // 出现 20 元时,找零
            // 贪心法的体现,优先使用一张 10 元与 一张 5 元的进行找零
            if (five >= 1 && ten >= 1) {
                five --;
                ten --;
            }
            // 10 元钞票不够时,再使用 3 张 5 元钞票找零
            else if (five >= 3) {
                five -= 3;
            } else {
                // 3 张 5 元与 1 张 10元,1 张 5 元均不拥有时,false
                return false;
            }
        }
    }
    // 遍历完数组时,返回 true
    return true;
}

四、执行用时

五、部分测试用例

public static void main(String[] args) {
    int[] bills = {5, 5, 5, 10, 20};  // output:true
//    int[] bills = {5, 5, 10};  // output:true
//    int[] bills = {10, 10};  // output:false
//    int[] bills = {5, 5, 10, 10, 20};  // output:false
    boolean result = lemonadeChange(bills);
    
    System.out.println(result);
}
posted @ 2020-05-16 09:29  知音12138  阅读(222)  评论(0编辑  收藏  举报