news 2026/9/2 22:02:35

贪心算法从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/9/1 17:52:35

手搭BLDC模型与电流滞回比较控制器实现方波控制

该模型采用电流滞回比较控制器对BLDC进行方波控制&#xff0c;其中BLDC模型为手搭模型&#xff0c;非采用自带的模型在电机控制领域&#xff0c;无刷直流电机&#xff08;BLDC&#xff09;因其高效、低噪等优势被广泛应用。今天咱就来唠唠如何通过手搭BLDC模型&#xff0c;配合…

作者头像 李华
网站建设 2026/9/1 17:52:38

燃烧室设计学习DAY4:湍流燃烧为何比层流燃烧快

目录 湍流燃烧与层流燃烧的速率对比&#xff1a;机理分析与动力学探讨 摘要 第一章 引言 第二章 层流燃烧&#xff1a;有序与缓慢的基准 2.1 层流火焰的结构与传播机制 2.2 层流燃烧速度的决定因素 第三章 湍流流动的基本特征 3.1 涡团结构 3.2 湍流强度与雷诺数 第四…

作者头像 李华
网站建设 2026/9/1 23:14:10

燃烧室设计学习DAY6:热力学第一定律:能量守恒的奥秘

目录 热力学第一定律深度解析&#xff1a;理论基础、历史演变与应用价值 引言 第一章&#xff1a;热力学第一定律的历史渊源与演进 1.1 热质说的统治与挑战 1.2 迈尔的直觉与贡献 1.3 焦耳的实验铁证 1.4 亥姆霍兹的数学化表述 第二章&#xff1a;热力学第一定律的科学…

作者头像 李华
网站建设 2026/9/1 15:07:59

力扣Hot100系列16(Java)——[堆]总结()

文章目录前言一、数组中的第K个大的元素1.题目2.代码3. 例子二、前k个高频元素1.题目2.代码3.理解1.PriorityQueue的排序规则2.offer方法和add方法的区别4. 例子三、数据流中的中位数1.题目2.代码3. 例子前言 本文记录力扣Hot100里面关于堆的三道题&#xff0c;包括常见解法和…

作者头像 李华
网站建设 2026/9/1 23:12:30

什么?Agent Skills在“货拉拉”AI应用尝试?

前言 美国时间 2025 年 12 月 18 日&#xff0c;Anthropic 正式宣布将 Agent Skills 发布为开放标准。去年刚写了篇关于 MCP 的文章&#xff0c;今年 Anthropic 发布了 Agent Skills&#xff0c;迫不及待的试一试&#xff0c;到底有没有宣发的那么强悍。 Agent Skills 是什么Th…

作者头像 李华
网站建设 2026/9/1 21:57:59

如何在没有旧手机的情况下设置新 iPhone?

如果您购买了新款 iPhone 17&#xff0c;却发现旧手机丢失、损坏或完全无法使用&#xff0c;您可能会担心如何设置新设备。好消息是&#xff0c;即使没有旧 iPhone&#xff0c;您仍然可以顺利设置新设备。本文将指导您如何在没有旧手机的情况下设置新 iPhone&#xff0c;帮助您…

作者头像 李华