leetcode 860 檸檬水找零 題解 詳解

2021-10-12 00:22:11 字數 2239 閱讀 8117

最後一種解法執行時間超過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 美元。注意,一開始你手頭沒有任何零錢。如果你能給每...