class Solution {
public boolean lemonadeChange(int[] bills) {
int five = 0;
int ten = 0;
for(int bill : bills) {
if(bill == 5) {
// 直接接收 5 美元的钞票
five++;
} else if(bill == 10) {
// 收到 10 美元的钞票,需要找回 5 美元的零钱
if(five == 0) return false;
five--;
ten++;
} else {
// 收到 20 美元的钞票,需要找回 15 美元的零钱
// 优先使用 10 美元和 5 美元的零钱,然后尝试使用三张 5 美元的零钱
if(ten > 0 && five > 0) {
ten--;
five--;
} else if(five >= 3) {
five -= 3;
} else {
return false;
}
}
}
return true;
}
}
通过模拟整个交易过程来解决这个问题。在这个过程中,需要跟踪你手头有多少 5 美元和 10 美元的钞票。每当有人支付 5 美元时,可以直接接受付款。当有人支付 10 美元时,需要有一张 5 美元的钞票来找零。当有人支付 20 美元时,需要有一张 10 美元和一张 5 美元的钞票或者三张 5 美元的钞票来找零。如果在任何时候不能找零,那么返回 false
。否则,可以通过整个过程,返回 true
。