天天看點

leetcode-860-檸檬水找零

題目描述:

在檸檬水攤上,每一杯檸檬水的售價為 

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

要完成的函數:

bool lemonadeChange(vector<int>& bills) 

說明:

1. 給定一個vector,裡面裝着前來購買5元檸檬水的顧客給的錢,隻可能會給5元/10元/20元,而你要給他們找零。

初始的時候,你手裡面隻有檸檬水,而沒有任何零錢。如果你能順利完成所有找零工作(意味着第一個顧客隻能給5元,友善你後續找零),那麼傳回true,如果不能完成所有找零工作,傳回false。

2. 這道題也不難,我們定義三個int變量,存儲目前5元有多少張,10元有多少張,20元有多少張。

每次有顧客來,判斷要找多少零錢,檢查一下目前的零錢能不能還,可以就找零,接着下一個顧客。

在找零的過程中,當顧客給了20元,我們優先使用10元和5元的組合找零給顧客,而不是3張5元。

因為5元的零錢更為重要,當顧客使用10元的時候,我們隻能找零5元零錢。

如果優先使用3張5元去找零,那麼極有可能最終剩下一大堆10元,而當顧客掏出10元購買檸檬水,我們卻沒有5元零錢來找零。

代碼如下:

bool lemonadeChange(vector<int>& bills) 
    {
        int five=0,ten=0,twenty=0;//定義三個變量,存儲每種零錢有幾張
        for(int money:bills)
        {
            if(money==5)//如果給了5元,那麼不用找零,更新變量就好了
                five++;
            else if(money==10)//如果給了10元,那麼判斷是否有5元零錢
            {
                if(five>=1)
                    five--;
                else
                    return false;
                ten++;
            }
            else//如果給了20元,先判斷是否有10元和5元的組合
            {
                if(ten>=1 && five>=1)
                {
                    ten--;
                    five--;
                }
                else if(five>=3)//如果沒有10元和5元的組合,那麼使用3張5元
                    five-=3;
                else //如果都沒有,那麼傳回false
                    return false;
                twenty++;
            }
        }
        return true;//順利完成所有找零工作,傳回true
    }           

複制

上述代碼實測16ms,beats 73.27% of cpp submission。

後記:發現了其實我們也可以不用統計twenty的個數,因為完全不需要用twenty去找零……