思路:这题虽然思路很简单,但是也有易错的地方,我一开始的做法是仅使用一个变量来保存收到的金额,如果手上的金额大于找零的金额即为true。实际上这是不正确的,本题的金额只有5 10 20 那么我们进行找零的时候也只能用5 10 20(实际上20用不到 因为最多只需要找零15)也就是说当我们手上有两张10 对方付给我们20的时候虽然金额总数更大 但是我们是没法找零钱的。
所以我们需要把收到的金额分类记录,分别记录5和10的数量,然后再遍历的时候对于收到的三种零钱进行判断即可 之后的思路就很一目了然了
class Solution {
public boolean lemonadeChange(int[] bills) {
// 分别记录5和10的数量
int five = 0;
int ten = 0;
for (int i = 0; i < bills.length ; i++) {
// 对于接收到的三种钱进行分别处理
if (bills[i] == 5){
five++;
}else if (bills[i] == 10){
if (five <= 0){
return false;
}
five--;
ten++;
}else {
// 收到20的时候有两种找法 优先使用十块钱的进行找回 因为5块钱适用的情况更多 需要尽可能留在手中
if (ten > 0&& five >0){
ten--;
five--;
} else if (five >= 3){
five -= 3;
}else {
return false;
}
}
}
return true;
}
}