1. 程式人生 > 其它 >489,檸檬水找零

489,檸檬水找零

技術標籤:資料結構和演算法檸檬水找零leetcode

在這裡插入圖片描述

想看更多演算法題,可以掃描上方二維碼關注我微信公眾號“資料結構和演算法”,截止到目前我已經在公眾號中更新了500多道演算法題,其中部分已經整理成了pdf文件,截止到目前總共有800多頁(並且還會不斷的增加),可以在公眾號中回覆關鍵字“pdf”即可下載。


問題描述

在檸檬水攤上,每一杯檸檬水的售價為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


問題分析

這道題算是生活中很常見的一道題,對於每一個顧客如果我們都有足夠的零錢給他找零,那麼就返回true,只要有一個顧客沒有足夠的零錢找給他就返回false。


顧客只能有3種紙幣 ,5元,10元,20元。我們要統計5元和10元的數量,20元的不需要統計,因為20元沒法找給別人。


  • 顧客給5元,5元的數量加1

  • 顧客給10元,5元的數量減1(減完之後再判斷5元的數量,如果小於0,說明5元的不夠了,沒法給顧客找零了,直接返回false)

  • 顧客給20元,根據生活常識,如果有10元的,應該先找他10元的,然後再找他一個5元的。如果沒有10元的就找他3個5元的,然後再判斷5元的數量,如果小於0直接返回false。

原理比較簡單,我們來看下程式碼

public boolean lemonadeChange(int[] bills) {
    //統計店員所擁有的5元和10元的數量(20元的不需要統計,
    //因為顧客只能使用5元,10元和20元,而20元是沒法
    // 給顧客找零的)
    int five = 0, ten = 0;
    for (int bill : bills) {
        if (bill == 5) {
            //如果顧客使用的是5元,不用找零,5元數量加1
            five++;
        } else if (bill == 10) {
            //如果顧客使用的是10元,需要找他5元,所以
            //5元數量減1,10元數量加1
            five--;
            ten++;
        } else if (ten > 0) {
            //否則顧客使用的只能是20元,顧客使用20元的時候,
            //如果我們有10元的,要儘量先給他10元的,然後再
            //給他5元的,所以這裡5元和10元數量都要減1
            ten--;
            five--;
        } else {
            //如果顧客使用的是20元,而店員沒有10元的,
            //就只能給他找3個5元的,所以5元的數量要減3
            five -= 3;
        }

        //上面我們找零的時候並沒有判斷5元的數量,如果5元的
        //數量小於0,說明上面某一步找零的時候5元的不夠了,
        //也就是說沒法給顧客找零,直接返回false即可
        if (five < 0) {
            return false;
        }
    }
    return true;
}

總結

一道生活常識問題,找零的時候我們並沒有先判斷5元的數量,而找完之後再判斷5元的數量是否是大於0還是小於0。如果在找零的時候先判斷5元的數量也是可以的,只不過稍微有一點點麻煩,因為顧客只要給的不是5元的都要先判斷。