最後一種解法執行時間超過99%
檸檬水找零
在檸檬水攤上,每一杯檸檬水的售價為 5 美元。
顧客排隊購買你的產品,(按賬單 bills 支付的順序)一次購買一杯。
每位顧客只買一杯檸檬水,然後向你付 5 美元、10 美元或 20 美元。你必須給每個顧客正確找零,也就是說淨交易是每位顧客向你支付 5 美元。
注意,一開始你手頭沒有任何零錢。
如果你能給每位顧客正確找零,返回 true ,否則返回 false 。
筆者在第一次思考本題時,在腦中例項化了乙個陣列充當錢箱,每當顧客支付時,便新增/減少錢箱當中的元素(低效的笨方法)
class
solution
:def
lemonadechange
(self, bills: list[
int])-
>
bool
: currentchanges=
for i in bills:
if i ==5:
5)if i==10:
if(5in currentchanges)
: currentchanges.remove(5)
10)else
:return
false
if i ==20:
billwhichis5=
0for i in currentchanges:
if i==5:
billwhichis5+=1if
5in currentchanges and
10in currentchanges:
currentchanges.remove(5)
currentchanges.remove(10)
elif billwhichis5>=3:
billwhichis5=billwhichis5-
3 currentchanges.remove(5)
currentchanges.remove(5)
currentchanges.remove(5)
else
:return
false
return
true
本題主要難點是如何處理支付了20元的客戶。思考思路為:
10元只可能用於為20元的客戶找零,而5元可以為10元的客戶找零,也可以為20元的客戶找零
因此在處理20元客戶時,應當優先使用10元,因為10元的泛型低於5元
上述**優先進行乙個10元+乙個5元的判定,其次才是三個5元的判定
上述方法的問題在於,將零錢例項化為陣列(列表)當中的元素,而這種例項化是毫無意義的(需要開闢陣列,這樣太低效,執行時間高達1000ms),更優的方法是,建立兩個標誌,用於記錄兩種面值的張數
執行時間超過99%
leetcode860檸檬水找零
在檸檬水攤上,每一杯檸檬水的售價為5美元。顧客排隊購買你的產品,按賬單bills支付的順序 一次購買一杯。每位顧客只買一杯檸檬水,然後向你付5美元 10美元或20美元。你必須給每個顧客正確找零,也就是說淨交易是每位顧客向你支付5美元。注意,一開始你手頭沒有任何零錢。如果你能給每位顧客正確找零,返回t...
LeetCode 860 檸檬水找零
在檸檬水攤上,每一杯檸檬水的售價為 5 美元。顧客排隊購買你的產品,按賬單 bills 支付的順序 一次購買一杯。每位顧客只買一杯檸檬水,然後向你付 5 美元 10 美元或 20 美元。你必須給每個顧客正確找零,也就是說淨交易是每位顧客向你支付 5 美元。注意,一開始你手頭沒有任何零錢。如果你能給每...
leetcode860 檸檬水找零
在檸檬水攤上,每一杯檸檬水的售價為 5 美元。顧客排隊購買你的產品,按賬單 bills 支付的順序 一次購買一杯。每位顧客只買一杯檸檬水,然後向你付 5 美元 10 美元或 20 美元。你必須給每個顧客正確找零,也就是說淨交易是每位顧客向你支付 5 美元。注意,一開始你手頭沒有任何零錢。如果你能給每...