- 思路
总体思想就是从前往后算,比较收到的钱是否大于要找零的钱;然后要找零尽量先找大面额,再找小面额,应为大面额用得少应该尽量要把它用出去,面额5就要尽量留着,应为它是万能的。
那么对于编码,有三种面额的钱,我们需要把它们的数目存下来,然后看是否满足找零的条件。
class Solution {
public boolean lemonadeChange(int[] bills) {
// 因为20的面额不能找零,所以不记录
int count_5 = 0, count_10 = 0;
for (int i = 0; i < bills.length; i++) {
if (bills[i] == 5) {
count_5++;
}
if (bills[i] == 10) {
if (count_5 <= 0) {
return false;
}
count_10++;
count_5--;
}
if (bills[i] == 20) {
if (count_10 > 0 && count_5 > 0) {
count_10--;
count_5--;
} else if (count_5 >= 3){ // 若没有10元
count_5 -= 3;
} else {
return false;
}
}
}
return true;
}
}
这道题是分了几种情况,但是写出来的代码有的会很复杂,有的会很简洁,这就和分情况有关了,比如可以将10和5面额写在一起判断,也可以先判断10再在内部判断5,但是这样就会感觉写得很复杂。