当前位置: 首页 > news >正文

贪心算法从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])和首尾节点;
  • 代码片段:
http://www.jsqmd.com/news/322479/

相关文章:

  • 燃烧室设计学习DAY6:热力学第一定律:能量守恒的奥秘
  • 网络安全学习路线(超详细版):从零基础到精通,一篇吃透不迷路
  • 2026 寒假任务事项
  • 仪表网推广服务有哪些?从建站到短视频:仪表网推广服务的完整体系解析
  • 大数据深度学习|计算机毕设项目|计算机毕设答辩|Python-智能表单识别系统的设计与实现
  • 【AI问答】人工智能与机器人产业,依赖最多的原材料是什么?有哪些共同点和不同点?
  • WeFi Technology Group宣布与PGA巡回赛新星建立合作关系
  • 新型多机器人协作运输系统如何适应复杂地形?清华大学创新方案|高精度动作捕捉助力新型履带式移动机器人多体协同控制
  • Ubuntu20.04无法联网
  • 燃烧室设计学习DAY4:湍流燃烧为何比层流燃烧快
  • 大脑健身房:把“休息”练成一种肌肉记忆
  • 2026年AI开发平台如何驱动金融、制造、零售的场景化落地?
  • AI论文工具如何选择?2026年精选12款写论文的AI工具深度测评,看这一篇就足够了! - 掌桥科研
  • 算清每一分钱:2026年AI开发平台选型与落地的精细化ROI测算模型
  • release版本也进行调试的设置
  • 铁威马F4-425Plus提供专属于创作者的解决方案
  • ISTA 3A 与 ASTM D4169 标准:核心差异与快速选择指南
  • 仪表网推广服务有哪些?
  • 常见问题解答 --- 169.254.是哪的地址
  • 乒乓球基本知识
  • 从“照搬”到“创造”:Java企业AI转型的场景范例突围之路
  • 埃夫特拿下欧洲2.5亿订单,一家中国机器人公司如何“嵌入“海外汽车工业体系
  • 什么?Agent Skills在“货拉拉”AI应用尝试?
  • 手搭BLDC模型与电流滞回比较控制器实现方波控制
  • AI应用开发热潮下,Java企业如何破解多模型接入困局?
  • LangChain入门(十三)- 6步实操Agent落地大法
  • 力扣Hot100系列16(Java)——[堆]总结()
  • 丢掉向量数据库!推理型 RAG 正在重新定义长文档问答的准确边界
  • 【开源鸿蒙跨平台开发先锋训练营】Day 19: 开源鸿蒙React Native动效体系构建与混合开发复盘
  • 【届数高、EI稳定快检索、ACM出版】第六届生物信息学与智能计算国际学术研讨会(BIC 2026)