題目:
在檸檬水?dāng)偵夏彼螅恳槐瓩幟仕氖蹆r(jià)為 5 美元互广。
顧客排隊(duì)購(gòu)買(mǎi)你的產(chǎn)品,(按賬單 bills 支付的順序)一次購(gòu)買(mǎi)一杯焙格。
每位顧客只買(mǎi)一杯檸檬水图毕,然后向你付 5 美元、10 美元或 20 美元眷唉。你必須給每個(gè)顧客正確找零予颤,也就是說(shuō)凈交易是每位顧客向你支付 5 美元。
注意冬阳,一開(kāi)始你手頭沒(méi)有任何零錢(qián)蛤虐。
如果你能給每位顧客正確找零,返回 true 肝陪,否則返回 false 驳庭。
示例 1:
輸入:[5,5,5,10,20]
輸出:true
解釋?zhuān)?br>
前 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
解釋?zhuān)?br>
前 2 位顧客那里能犯,我們按順序收取 2 張 5 美元的鈔票。
對(duì)于接下來(lái)的 2 位顧客犬耻,我們收取一張 10 美元的鈔票踩晶,然后返還 5 美元。
對(duì)于最后一位顧客枕磁,我們無(wú)法退回 15 美元渡蜻,因?yàn)槲覀儸F(xiàn)在只有兩張 10 美元的鈔票。
由于不是每位顧客都得到了正確的找零计济,所以答案是 false茸苇。
思路一:
使用map記錄記錄金額和張數(shù)。
遍歷數(shù)組沦寂,判斷收入金額:如果為5学密,直接入map。
如果為10传藏,需要找零5一張腻暮。
如果為20,可以找一張10塊和一張5塊毯侦,也可以找零3張5塊哭靖。
代碼如下:
public boolean lemonadeChange(int[] bills) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();// 記錄錢(qián)和張樹(shù)
for (int i = 0; i < bills.length; i++) {
if (bills[i] == 5) {
map.put(bills[i], map.getOrDefault(bills[i], 0) + 1);
} else if (bills[i] == 10) {
// 如果map有一張5塊
if (!map.containsKey(5) || map.get(5) < 1) {
return false;
}
map.put(5, map.get(5) - 1);// 找零5塊
map.put(10, map.getOrDefault(10, 0) + 1);// 10塊入記賬map
} else {
if (!map.containsKey(5) || map.get(5) < 1) {// 20塊無(wú)5塊找零
return false;
}
// 先找零10塊,再找零5塊
if (!map.containsKey(10) || map.get(10) < 1) {// 找3張5塊
if (map.get(5) < 3) {
return false;
}
map.put(5, map.get(5) - 3);// 找3張5塊
} else {// 找1張10塊侈离,一張5塊
map.put(10, map.get(10) - 1);// 找3張5塊
map.put(5, map.get(5) - 1);// 找3張5塊
}
}
}
return true;
}
-------------------------------小白學(xué)算法