前言
贪心算法的核心思想是在每一步选择中都采取当前状态下最优的策略,从而希望导致结果是全局最优的。虽然它并不总能得到正确答案,但在许多特定场景下非常高效。今天我们通过三道经典的 LeetCode 题目,来梳理一下贪心策略在不同问题中的具体应用。
一、柠檬水找零 (860)
思路分析
这道题模拟了一个简单的收银场景。每杯柠檬水 5 元,顾客只能按顺序付款,面额只有 5、10、20 三种。我们需要判断是否能给每一位顾客正确找零。
关键点在于找零时的资源分配。当我们收到 20 元时,需要找 15 元。此时我们有两种组合方式:一张 10 元和一张 5 元,或者三张 5 元。显然,优先使用 10 元 +5 元的组合更划算,因为 5 元纸币是找零 10 元和 20 元的基础货币,保留更多的 5 元能增加后续找零的成功率。
此外,如果第一位顾客给的不是 5 元,直接无法开始交易,返回 false。
参考实现
class Solution {
public boolean lemonadeChange(int[] bills) {
int five = 0;
int ten = 0;
for (int bill : bills) {
if (bill == 5) {
five++;
} else if (bill == 10) {
if (five == 0) return false;
five--;
ten++;
} else {
// 收到 20 元,需找 15 元
if (ten > 0 && five > 0) {
ten--;
five--;
} else if (five >= 3) {
five -= 3;
} else {
;
}
}
}
;
}
}


