分享简单算法:柠檬水找零
在柠檬水摊上,每一杯柠檬水的售价为 5
美元。
顾客排队购买你的产品,(按账单 bills
支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5
美元、10
美元或 20
美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5
美元。
注意,一开始你手头没有任何零钱。
如果你能给每位顾客正确找零,返回 true
,否则返回 false
。
示例 1:
语言:java
class Solution {
public boolean lemonadeChange(int[] bills) {
int five = 0, ten = 0;
for (int bill: bills) {
if (bill == 5)
five++;
else if (bill == 10) {
if (five == 0) return false;
five--;
ten++;
} else {
if (five > 0 && ten > 0) {
five--;
ten--;
} else if (five >= 3) {
five -= 3;
} else {
return false;
}
}
}
public boolean lemonadeChange(int[] bills) {
int five = 0, ten = 0;
for (int bill: bills) {
if (bill == 5)
five++;
else if (bill == 10) {
if (five == 0) return false;
five--;
ten++;
} else {
if (five > 0 && ten > 0) {
five--;
ten--;
} else if (five >= 3) {
five -= 3;
} else {
return false;
}
}
}
return true;
}
}
}
}
时间复杂度为O(n),注意分情况一种一种情况,依次讨论。
方法:模拟情景
思路与算法
让我们尝试模拟给每个购买柠檬水的顾客进行找零的过程。最初,我们从没有 5
美元钞票也没有 10
美元钞票的情况开始。
-
如果顾客支付了 5 美元钞票,那么我们就得到 5 美元的钞票。
-
如果顾客支付了 10 美元钞票,我们必须找回一张 5 美元钞票。如果我们没有 5 美元的钞票,答案就是
false
,因为我们无法正确找零。 -
如果顾客支付了 20 美元钞票,我们必须找回 15 美元。
-
如果我们有一张 10 美元和一张 5 美元,那么我们总会更愿意这样找零,这比用三张 5 美元进行找零更有利。
-
否则,如果我们有三张 5 美元的钞票,那么我们将这样找零。
-
否则,我们将无法给出总面值为 15 美元的零钱,答案是
false
。
-