news 2026/5/1 22:41:53

贪心算法从0到1完全指南(含LeetCode Top100考题解析)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
贪心算法从0到1完全指南(含LeetCode Top100考题解析)

一、贪心算法理论基础(0基础入门)

1. 贪心算法的核心定义

贪心算法的本质是通过每一步选择局部最优解,最终堆叠出全局最优解。它不追求全局最优的推导过程,而是基于当前阶段的最优选择,逐步逼近最终目标。

举个通俗例子:从一堆不同面额的钞票中取10张,要得到最大金额,每次选当前剩下的最大面额钞票(局部最优),最终总和就是最大金额(全局最优)。但需注意,贪心并非万能——若用“选最大盒子装满背包”的思路,可能无法达到最优解(此时需动态规划)。

2. 贪心算法的适用场景

贪心没有固定套路,核心判断标准:

  • 手动模拟局部最优策略,能推出全局最优,且找不出反例;
  • 问题可拆分为独立的子问题,每个子问题的最优解能累积为全局最优;
  • 常见适用场景:区间问题(合并、覆盖、去重)、资源分配、序列构造等。

3. 贪心算法的解题步骤(简化版)

无需拘泥于复杂理论,核心三步:

  1. 拆分问题:将原问题拆解为多个独立的子问题;
  2. 确定局部最优策略:明确每个子问题的最优选择标准(如“选最大”“选最早结束”);
  3. 累积最优解:将所有子问题的局部最优解合并,得到全局最优。

4. 贪心与其他算法的区别

算法类型核心特点适用场景
贪心算法局部最优推导全局最优,无回溯子问题独立、局部最优可累积
动态规划存储子问题结果,考虑重叠子问题子问题重叠、需回溯验证
暴力算法遍历所有可能解小规模问题,无优化空间

二、LeetCode Top100贪心算法核心考题(分类解析)

(一)基础入门题(常识性贪心,难度★★☆)

1. 分发饼干(LeetCode 455)
  • 题目描述:每个孩子有胃口值g[i],每块饼干有尺寸s[j],s[j]≥g[i]时可满足孩子。求最多满足的孩子数。
  • 局部最优:大饼干优先满足大胃口孩子(避免小饼干浪费);
  • 解题步骤:
    1. 对g和s排序(从小到大或从大到小);
    2. 从后向前遍历胃口数组,用大饼干匹配大胃口;
  • 代码片段:
intfindContentChildren(vector<int>&g,vector<int>&s){sort(g.begin(),g.end());sort(s.begin(),s.end());intindex=s.size()-1,res=0;for(inti=g.size()-1;i>=0;--i){if(index>=0&&s[index]>=g[i]){res++;index--;}}returnres;}
2. K次取反后最大化的数组和(LeetCode 1005)
  • 题目描述:对数组元素执行K次取反操作,求最终最大数组和。
  • 局部最优:
    1. 先将绝对值大的负数取反(转化为正数,提升总和);
    2. 若K剩余为奇数,取反最小的正数(损失最小);
  • 代码片段:
staticboolcmp(inta,intb){returnabs(a)>abs(b);}intlargestSumAfterKNegations(vector<int>&A,intK){sort(A.begin(),A.end(),cmp);for(inti=0;i<A.size()&&K>0;++i){if(A[i]<0){A[i]*=-1;K--;}}if(K%2==1)A.back()*=-1;returnaccumulate(A.begin(),A.end(),0);}
3. 柠檬水找零(LeetCode 860)
  • 题目描述:柠檬水售价5美元,顾客支付5/10/20美元,需正确找零(初始无零钱)。
  • 局部最优:收到20美元时,优先用10+5找零(5美元更万能,可用于10和20美元找零);
  • 代码片段:
boollemonadeChange(vector<int>&bills){intfive=0,ten=0;for(intbill:bills){if(bill==5)five++;elseif(bill==10){five--;ten++;}else{// 20美元if(ten>0&&five>0){ten--;five--;}elsefive-=3;}if(five<0)returnfalse;}returntrue;}

(二)序列问题(贪心策略+细节处理,难度★★★)

1. 摆动序列(LeetCode 376)
  • 题目描述:连续数字的差严格正负交替为摆动序列,求最长摆动子序列长度(可删除元素)。
  • 局部最优:删除单调坡度上的中间节点(保留两端峰值,增加摆动次数);
  • 关键细节:处理平坡(如[1,2,2,2,1])和首尾节点;
  • 代码片段:
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 3:54:52

丢掉向量数据库!推理型 RAG 正在重新定义长文档问答的准确边界

前言 在大模型应用落地的浪潮中&#xff0c;RAG&#xff08;检索增强生成&#xff09;一度被视为解决知识幻觉、提升事实准确性的“银弹”。然而&#xff0c;当开发者真正将 RAG 投入企业级场景——比如解析一份 300 页的 SEC 财报、一份技术标准文档或一本法律汇编时&#xf…

作者头像 李华
网站建设 2026/5/1 4:07:38

uniapp+python美食大全订阅小程序设计与实现

目录系统架构设计核心功能模块技术实现要点数据交互流程性能优化方案开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统架构设计 采用前后端分离架构&#xff0c;前端使用UniApp跨平台框架…

作者头像 李华
网站建设 2026/5/1 16:13:01

导师严选!自考必备TOP9 AI论文网站深度测评

导师严选&#xff01;自考必备TOP9 AI论文网站深度测评 自考路上的智能助手&#xff1a;AI论文网站测评指南 随着人工智能技术的快速发展&#xff0c;越来越多的自考生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的AI论文网站&#xff0c;如何选择真…

作者头像 李华
网站建设 2026/5/1 12:52:16

单片机红外遥控系统设计

单片机红外遥控系统设计与实现 一、设计背景与意义 红外遥控凭借成本低廉、功耗低、抗干扰能力较强等优势&#xff0c;广泛应用于电视、空调、机顶盒等家电设备控制场景。传统红外遥控系统存在编码单一、控制功能有限、兼容性差等问题&#xff0c;难以适配多品牌多类型设备的统…

作者头像 李华
网站建设 2026/5/1 17:48:04

Optional的学习

Optional的核心减少代码里出现 空指针异常&#xff08;NullPointerException&#xff09;的情况常见使用场景当你想使用某个对象中的方法&#xff0c;但又不清楚这个对象是不是为null&#xff0c;这个时候&#xff0c;你就会想到用if( xxx ! null) 来判断这个对象是不是null&a…

作者头像 李华
网站建设 2026/5/1 10:04:24

直播预告|如意玲珑:Linux 跨发行版包管理器解析

“一场直面 Linux 依赖地狱的技术拆解直播” 在 Linux 世界里&#xff0c;依赖冲突、环境不一致、跨发行版分发困难&#xff0c;几乎是每个开发者都绕不开的问题。 软件包能不能做到“一次构建&#xff0c;多发行版运行”&#xff1f; 系统环境和应用运行环境&#xff0c;真的可…

作者头像 李华