力扣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
位顧客那裡,我們按順序收取2
張5
美元的鈔票。
對於接下來的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
這個變數沒有用到,故在上述程式碼中沒有新增。之後也去參考了其他的題解,這個題好像也沒啥可優化的啦~
三、總結
最近貪心題目做的有點勤呀!能馬上感覺到這個是貪心就滿足了,至少說明對貪心有點理解啦~加油!