860. 柠檬水找零『简单』
题目来源于力扣(LeetCode)
一、题目
题目相关标签:贪心算法
提示:
0 <= bills.length <= 10000
bills[i]
不是5
就是10
或是20
二、解题思路
-
该题可以用现实生活中的方式来完成模拟,即模拟情景,再用代码的方式表现出现即可
-
定义两个变量用于记录 5 元及 10 元钞票出现的次数
-
当出现 10 元时,判断是否最少有一个 5 元存在,即记录 5 元钞票的变量大于 0
-
当出现 20 元时,有 1 张 10 元加 1 张 5 元找零,3 张 5 元找零的两种方式
-
那么采用贪心法的思想,优先使用 1 张 10 元加 1 张 5 元找零方式,当条件不满足时,再考虑 3 张 5 元找零的方式,均不满足时,说明无法进行找零,return false
因为 5 元钞票可以组成 10 元钞票,而 10 元钞票无法组成 5 元钞票
三、代码实现
public static boolean lemonadeChange(int[] bills) {
int five = 0; // 记录 5 元出现的次数
int ten = 0; // 记录 10 元出现的次数
// 排除特殊情况:数组长度为零时
if (bills.length == 0) {
return true;
}
// 排除特殊情况:数组首位不为 5 时
if (bills[0] == 10 || bills[0] == 20) {
return false;
}
for (int i = 0; i < bills.length; i++) {
if (bills[i] == 5) {
five ++;
} else if (bills[i] == 10) {
// 对 10 元找零
if (five == 0) {
return false;
}
// 5 元加 1,10 元减 1
five --;
ten ++;
} else {
// 出现 20 元时,找零
// 贪心法的体现,优先使用一张 10 元与 一张 5 元的进行找零
if (five >= 1 && ten >= 1) {
five --;
ten --;
}
// 10 元钞票不够时,再使用 3 张 5 元钞票找零
else if (five >= 3) {
five -= 3;
} else {
// 3 张 5 元与 1 张 10元,1 张 5 元均不拥有时,false
return false;
}
}
}
// 遍历完数组时,返回 true
return true;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
int[] bills = {5, 5, 5, 10, 20}; // output:true
// int[] bills = {5, 5, 10}; // output:true
// int[] bills = {10, 10}; // output:false
// int[] bills = {5, 5, 10, 10, 20}; // output:false
boolean result = lemonadeChange(bills);
System.out.println(result);
}