news 2026/4/3 5:01:34

贪心算法从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/4/3 2:03:34

uniapp+python基于微信小程序的舞蹈工作室报名管理系统

目录 系统概述技术架构核心功能模块代码示例&#xff08;关键部分&#xff09;系统优势 开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 基于UniApp和Python的舞蹈工作室报名管理…

作者头像 李华
网站建设 2026/3/31 4:01:05

【毕业设计】图书馆大数据分析系统的设计与实现

&#x1f49f;博主&#xff1a;程序员陈辰&#xff1a;CSDN作者、博客专家、全栈领域优质创作者 &#x1f49f;专注于计算机毕业设计&#xff0c;大数据、深度学习、Java、小程序、python、安卓等技术领域 &#x1f4f2;文章末尾获取源码数据库 &#x1f308;还有大家在毕设选题…

作者头像 李华
网站建设 2026/3/31 6:23:17

26.1 案例找茬万金油100条

一、 项目启动与治理 问题现象优化后的专业表述改正建议知识点归类仅凭初步了解就制定项目章程项目章程编制缺乏充分的业务背景、干系人期望和约束条件输入&#xff0c;导致目标模糊、授权不足应在完成可行性研究、干系人识别后&#xff0c;由项目发起人主导编制并正式发布章程…

作者头像 李华
网站建设 2026/3/27 16:25:48

全网最全网络安全学习路线(2026 新版)从入门到精通 收藏即用

首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习 linux 系统及命令的路上&#xff0c;更多的人会倒在学习语言上&#xff1b; 2、知识点掌握程度不清楚 对于网络安…

作者头像 李华
网站建设 2026/3/29 2:54:59

禁言WPS

路径 B:软禁用方案(Runtime Interception)详细实施步骤 核心思路: 不修改 Android.bp 和 android.config,保持 CONFIG_WPS=y 和 CONFIG_WEP=y 编译宏开启。这样可以保证所有结构体定义完整,编译不会报错。我们在 HAL 层接口(AIDL/HIDL)函数的最前端进行拦截,直接返回“…

作者头像 李华