哈喽,各位编程小白宝子们~ 今天咱们聊一个超接地气的算法——贪心算法。不用怕听不懂,全程没有复杂术语,全靠生活小事带入门,学会了就能轻松搞定好几道力扣基础题,赶紧码住!
一、开篇:用生活小事,读懂贪心
咱们先不聊代码,先想想生活里的小事——分饼干:假设你是一位超贴心的家长,要给家里的小朋友们分饼干。每个孩子都有一个“小胃口”:有的孩子至少要吃尺寸为1的饼干才满足,有的得要尺寸为2,还有的要3。而你手里有一堆不同尺寸的饼干,每个孩子最多只能拿一块,你的目标是让尽可能多的孩子开心,这个时候你会怎么分?
不用多想,肯定是先拿最小的饼干,去满足胃口最小的孩子;剩下的饼干里,再找最小的,去满足下一个胃口小的孩子,就这么一步步来。这样做,既能不浪费大饼干,又能让更多孩子吃到满意的饼干——这就是贪心算法的雏形!
这个场景对应的就是力扣经典入门题:455. 分发饼干,题目链接放这了,感兴趣的可以先看看(不用急着做,看完博客再试更轻松):https://leetcode.cn/problems/assign-cookies/description/
其实不止分饼干,生活里很多事都是贪心思路:比如用最少的硬币凑10元钱,咱们都会优先拿5元、1元的大面值,再用小额补;比如有限的钱买最多水果,会优先选便宜又爱吃的,多买几样。
重点来了——这种“当下选最好的,不管以后”的思路,就是贪心算法!不用复杂计算,不用纠结全局,跟着直觉选最优,简单又高效。
这里要澄清一句:贪心不是“笨办法”,也不是“瞎选”,它是一种“简单高效的优先策略”,专门适合解决一些特定的基础问题,小白入门先吃透它,能少走很多弯路。
二、什么是贪心算法?
看完生活例子,咱们给贪心算法一个通俗到能直接背的定义,不用记公式,不用懂复杂逻辑:不纠结全局最优,每一步都做“当前看起来最好的选择”,最后一步步凑出整体的最优解。
还是举个简单的例子帮大家理解,用“找路”来说:假如你要从家去超市,不知道哪条路最近,贪心算法的思路就是:每次走到一个路口,都选眼前看起来最近的那条路,不管这条路最后会不会绕远,先把当下的“最近”把握住。虽然有时候可能不是全局最短,但大多数简单场景下,这样走都能快速到达目的地——这就是贪心的核心逻辑。
关键提醒:贪心不是万能的,它解决不了所有问题,但能搞定很多“简单场景”的问题。咱们小白入门,不用纠结它的局限性,先学会判断“什么时候能用”,先能用它解题就赢了。
三、贪心算法的核心步骤(3步走,一看就会)
不管是生活场景,还是编程解题,贪心算法的用法都离不开这3步,记好这3步,小白也能轻松上手:
第一步:明确“目标”
先想清楚,咱们要解决什么问题?比如“凑够10元钱”“买最多的水果”“让最多的孩子分到饼干”“找到买卖股票的最大利润”——目标越明确,后续的策略越好找。
第二步:找到“贪心策略”
这是最关键的一步:想清楚“每一步选什么,对实现目标最有利”。比如目标是“凑够10元且硬币数量最少”,策略就是“优先选大面值硬币”;目标是“让最多孩子分到饼干”,策略就是“小饼干先给小胃口的孩子”。
第三步:执行到底,验证结果
按照咱们确定的贪心策略,一步步执行,最后看看是不是达到了目标。比如凑钱,按大面值优先选,最后凑够10元,数一数硬币数量,就是最少的;分饼干,按小饼干配小胃口,最后数一数满足的孩子数量,就是最多的。
小补充:用“分饼干”再走一遍3步,强化理解
1. 目标:让尽可能多的孩子分到满意的饼干;
2. 贪心策略:先把孩子的胃口从小到大排序,再把饼干的尺寸从小到大排序,用最小的饼干去匹配最小的胃口,匹配成功就继续下一组,匹配失败就跳过这块饼干(因为这块饼干太小,满足不了当前孩子,也满足不了后面胃口更大的孩子);
3. 执行验证:按排序后的顺序,一步步匹配,最后统计匹配成功的次数,就是能满足的最多孩子数量——完美达成目标!
四、入门案例:两道力扣题,手把手教你写代码
看完理论和生活例子,咱们上手写代码!选了两道力扣入门级贪心题,每道题都附题目链接、题目大意、贪心策略,还有详细的代码解读,小白也能跟着敲、跟着懂,不用怕看不懂~
案例1:买卖股票的最佳时机(力扣121题)
题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/?envType=study-plan-v2&envId=top-100-liked
题目大意:给定一个数组,数组里的每个数字代表某一天股票的价格,我们只能做一次买入和一次卖出操作(买入在前,卖出在后),求能获得的最大利润;如果没有利润(比如价格一直下跌),就返回0。
贪心策略:遍历股票价格时,一直记录“当前遇到的最低价格”(相当于找到最便宜的买入时机),同时计算“当前价格 – 最低价格”的差值(相当于当前卖出能获得的利润),全程保存最大的那个差值,最后返回这个最大差值就是答案。
代码+详细解读(Java版,小白友好,注释拉满,直接复制就能跑)
public class Solution {
public int maxProfit(int[] prices) {
// 处理空数组,避免报错(小白必记细节)
if (prices == null || prices.length == 0) {
return 0;
}
int minPrice = prices[0]; // 初始最低价格=第一天价格
int maxProfit = 0; // 初始利润为0,下跌时直接返回
// 从第二天开始遍历,第一天只能买不能卖
for (int i = 1; i < prices.length; i++) {
// 遇到更便宜的,就更新最低买入价
if (prices[i] < minPrice) {
minPrice = prices[i];
} else {
// 计算当前利润,更新最大利润
int currentProfit = prices[i] – minPrice;
maxProfit = Math.max(maxProfit, currentProfit);
}
}
return maxProfit;
}
}
代码解读:
1. 先处理空数组/长度为0的情况,避免程序报错,小白容易忽略这一步;
2. minPrice负责记最便宜的买入价,贪心核心就是“当下选最划算的”;
3. 遍历只做两件事:更便宜就更新低价,否则算利润,不用纠结后续价格;
4. 测试小例子:prices = [7,1,5,3,6,4],最终maxProfit=5,完美匹配预期~
案例2:跳跃游戏(力扣55题)
题目链接:https://leetcode.cn/problems/jump-game/description/
题目大意:给定一个非负整数数组nums,我们从数组的第一个位置(下标0)出发,数组里每个位置的数字代表“从这个位置能跳的最大长度”(比如nums[0]=3,就说明从下标0能跳到下标1、2、3)。判断我们能不能跳到数组的最后一个位置(下标为len(nums)-1)。
贪心策略:遍历数组时,一直记录“当前能到达的最远位置”。如果遍历到某个位置时,发现这个位置已经超过了“最远能到达的位置”,说明我们跳不到这里,直接返回False;如果遍历过程中,“最远能到达的位置”已经覆盖了数组的最后一个下标,说明我们能跳到终点,直接返回True(不用继续遍历,节省时间)。
代码+详细解读(Java版,注释拉满,小白可直接复制运行)
public class Solution {
public boolean canJump(int[] nums) {
int maxReach = 0; // 当前能跳到的最远位置,初始在起点0
int n = nums.length;
for (int i = 0; i < n; i++) {
// 当前位置跳不到,直接返回false
if (i > maxReach) {
return false;
}
// 更新最远能跳的位置,取当前最大值
maxReach = Math.max(maxReach, i + nums[i]);
// 能跳到终点,直接返回true,省时间
if (maxReach >= n – 1) {
return true;
}
}
// 数组只有1个元素时,直接返回true
return true;
}
}
代码解读:
1. maxReach是核心:记当下能跳的最远距离,贪心就是“每次尽量跳最远”;
2. 关键判断:i > maxReach,说明跳不到当前位置,直接返回false(比如nums = [3,2,1,0,4]);
3. 提前返回:一旦能到终点就停,不用浪费时间遍历;
4. 小白技巧:不用想下一步跳几步,盯紧maxReach就够了~
五、贪心算法的“坑”(小白必避,不用怕出错)
很多小白可能会觉得:“贪心也太简单了,随便选当下最好的就行?” 其实不然!贪心有局限性,不是所有问题都能用,这部分帮大家避坑,轻松绕开雷区~
1. 反例警示:不是所有问题都能用贪心!
还是用咱们熟悉的“凑零钱”例子,不过改一改硬币面值:假设硬币面值是1元、3元、4元,我们要凑出6元钱,要求硬币数量最少。按贪心思路,优先选最大面值4元,剩下2元用2枚1元,总共3枚(4+1+1=6)。
但最优解是2枚3元(3+3=6)!这就说明,贪心在这里失效了——只顾当下选最大,反而得不到全局最优,小白记好这个反例就够了。
重点:贪心不是万能的,不能盲目套用哦~
2. 总结:哪些场景能用贪心?哪些不能用?
不用记复杂术语,用大白话总结,结合场景就能判断:
✅ 能用贪心的场景
每一步的最优选择,能累积成全局最优——当下选最好的,不影响后续,最后结果就是最优。
– 分饼干:小饼干配小胃口,每一步的选择都能让更多孩子满足,最后累积的结果就是“最多孩子满足”;
– 买卖股票:选当下最便宜的价格买入,每一步的选择都能保证成本最低,最后累积的利润就是最大利润;
– 跳跃游戏:每次跳得尽可能远,每一步的选择都能让最远位置更远,最后就能判断是否能到终点。
❌ 不能用贪心的场景
当下的最优选择,会影响后续,导致最终结果不是全局最优——只顾当下好,后面就没更好的选择了。
还是刚才的凑零钱例子:选4元(当下最优),后面只能用1元凑,反而用更多硬币;选3元,后续还能再选3元,更优。
生活里也有类似情况:从家去超市,每次选最近的路口,可能绕远路,反而更费时间。
3. 不用急于求成
小白入门不用急,先吃透简单题(分饼干、两道力扣题),练熟后再慢慢区分不能用的场景,循序渐进就好。
记住:编程入门,“会用”比“死记理论”更重要!
六、结尾:总结+小白入门建议(跟着做,就能学会)
1. 核心总结(1句话,记牢就行)
贪心算法 = 每一步选当前最优,简单高效,选对策略就能搞定很多基础题!
2. 小白入门建议(跟着做,不踩坑)
① 吃透两道力扣题:动手敲Java代码,改改参数(比如prices = [7,6,4,3,1],nums = [2,0,0]),感受贪心逻辑;
② 找生活场景练手:比如“凑100元纸币”“预算内买最多零食”,梳理对应的贪心策略;
③ 不盲目套用:遇到新问题,先想“当下最优能不能累积成全局最优”,不确定就找反例试试。
3. 延伸(可选)
今天讲的是贪心入门,后续会更新进阶案例(划分字母区间、无重叠区间),思路不变,难度稍升。感兴趣的小白可以关注一下,后续一起进阶,慢慢吃透贪心算法~
最后碎碎念
小白必记:贪心不难,核心就是“跟着直觉选当下最好的”,不用怕术语、不用怕出错,多敲多练就会!
看完这篇,能敲出两道Java代码、说出3个核心步骤、区分简单场景,你就赢啦!祝各位小白,都能跟着贪心算法,轻松入门编程,搞定更多力扣题✨
网硕互联帮助中心

评论前必须登录!
注册