1. 程式人生 > 其它 >力扣860-檸檬水找零(又一道貪心入門題,你學廢了嗎?Java詳細題解)

力扣860-檸檬水找零(又一道貪心入門題,你學廢了嗎?Java詳細題解)

技術標籤:演算法刷題javaleetcode演算法貪心演算法

力扣860-檸檬水找零

一、原題題目

1.1 題目

  在檸檬水攤上,每一杯檸檬水的售價為 5 美元。顧客排隊購買你的產品,(按賬單 bills 支付的順序)一次購買一杯。每位顧客只買一杯檸檬水,然後向你付 5 美元、10 美元或 20 美元。你必須給每個顧客正確找零,也就是說淨交易是每位顧客向你支付 5 美元。

  注意,一開始你手頭沒有任何零錢。如果你能給每位顧客正確找零,返回 true ,否則返回 false 。

1.2 示例

  • 示例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 位顧客那裡,我們按順序收取 25 美元的鈔票。
    對於接下來的 2 位顧客,我們收取一張 10 美元的鈔票,然後返還 5 美元。
    對於最後一位顧客,我們無法退回 15 美元,因為我們現在只有兩張 10

    美元的鈔票。
    由於不是每位顧客都得到了正確的找零,所以答案是 false

提示:

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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/lemonade-change

二、解題思路

2.1 貪心思路解題

  • 解題思路

  讀完題目我又感覺這是一道貪心的題,都有點懷疑自己啦!這幾天看到題老是想到貪心。這裡我用三個變數 five ten twenty 來儲存手頭上擁有的 5 美元,10 美元,20 美元鈔票的數量,當遍歷賬單時,按如下規則處理:

  • 5 美元:不用找零,直接 five + 1

  • 10 美元:必須要找零一個 5 美元,如果有即 five > 0 ,則 five - 1 ,否則返回 false

  • 20 美元:必須找零 15 美元,儘可能的先找一個 10 美元,再找一個 5 美元(貪心的體現)如果沒有 10 美元的,則需要找三個 5 美元的,否則返回 false

    1.如果 five >= 1 && ten >= 1 ,則 five - 1 ,ten - 1
    2.如果 ten == 0 && five >= 3 ,則 five - 3
    3.否則返回 false

  • 詳細程式碼(Java)

public class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0,ten = 0;                   // 定義兩個用於找零面額鈔票數量的變數
        for (int i = 0;i<bills.length;i++){     // 遍歷每一個賬單
            if (bills[i]==5)    five++;         // 當前賬單為5美元,直接收下,不用找零
            if (bills[i]==10){                  // 當前賬單為10美元
                if (five > 0) {                 // 有5美元的找
                    ten++;                      // 則收10美元
                    five--;                     // 找零5美元
                }
                else return false;              // 沒有5美元的找則返回false
            }
            if (bills[i]==20){                  // 當前賬單為20美元
                if (five>0&&ten>0){             // 有10美元和5美元的找
                    five--;                     // 找零一個10美元
                    ten--;                      // 找零一個5美元
                }
                else if (ten == 0&&five>2){     // 沒有10美元只有足夠5美元的找
                    five-=3;                    // 找零三個5美元
                }
                else return false;              // 沒有可找零的方案返回false
            }
        }
        return true;
    }
}
  • 程式碼執行結果
演算法執行結果

  寫程式碼時發現 twenty 這個變數沒有用到,故在上述程式碼中沒有新增。之後也去參考了其他的題解,這個題好像也沒啥可優化的啦~

三、總結

  最近貪心題目做的有點勤呀!能馬上感覺到這個是貪心就滿足了,至少說明對貪心有點理解啦~加油!