贪心算法(局部最优实现全局最优)第一篇

贪心算法(局部最优实现全局最优)第一篇

目录

1. 什么是贪心算法

2. 贪心算法的解题步骤

3. 具体例题及代码

3.1 LeetCode860. 柠檬水找零

3.2 LeetCode2208. 将数组和减半的最少操作次数

3.3 LeetCode179. 最大数


从这篇文章开始,我们开始讲解贪心算法。

1. 什么是贪心算法

贪心算法是算法设计中的经典思想,核心逻辑用一句话就能概括 ——每一步都做出当前情况下的最优选择,不回头、不纠结,最终期望得到全局最优解。它不像动态规划那样依赖中间状态存储,也不用回溯尝试所有可能,凭借 “直来直往” 的思路,成为解决特定问题的高效方案。

2. 贪心算法的解题步骤

  1. 问题拆解:将复杂问题拆分成多个连续的局部决策步骤。
  2. 确定贪心策略:明确每一步的 “最优标准”(比如 “选最小”“选最大”“选最早结束”)。
  3. 验证可行性:确认该策略能满足 “局部最优推全局最优”,避免无效贪心
  4. 代码实现:通常先排序(按策略对应的规则),再遍历执行贪心选择。

之所以给第三步加粗,是因为这一步在我看来是最重要的。因为有些题目看起来好像可以使用贪心,但是实际上是不可以的,很多时候局部最优达不到全局最优解。

同时在我看来它也没有具体的模版,因为它要根据每一题来设计不同的贪心思路。我觉得贪心最重要的就是经验。

3. 具体例题及代码

3.1 LeetCode860. 柠檬水找零

我们看下面这张图片,要求是模拟实现找零,那么我们的策略就是每一次都尽量给大的零钱,因为这样我们可以确保只会出现零钱不够的情况,不会出现有钱但是无法使用的情况。

所以代码设计也很简单,就是找零能用大的就用大的,就这样设计就好了。在我们一开始对于贪心算法的学习过程中我觉得最重要的就是我们可以想到使用贪心算法。

其实这道题的代码也很好写,就是几个条件判断就好了。

class Solution { public: bool lemonadeChange(vector<int>& bills) { int a=0;//5 int b=0;//10 int c=0;//20 int sz=bills.size(); for(int i=0;i<sz;++i) { int num=bills[i]; if(num==20) { if(b&&a) { b--; a--; c++; } else if(a>3||a==3) { a-=3; c++; } else return false; } if(num==10) { if(a) { a--; b++; } else return false; } if(num==5) a++; } return true; } };

3.2 LeetCode2208. 将数组和减半的最少操作次数

我们看下面这道题,题目要求我们最小次数的对数组里面的数除以2,使数组和小于等于原先数组的一半。其实从题目上我们很好想到,就是每次找数组里面最大的数,然后给它减去一半。

我们看下面这个代码,其实我们只要知道priority_queue就可以很快的做出来这道题,priority_queue是默认大堆的,所以我们在这里就不用更改。同时它每插入一个数都会对其进行排序,所以我们只要不断的取出堆顶的元素就好了。

class Solution { public: int halveArray(vector<int>& nums) { priority_queue<double> p; double a1=0; double a2=0; for(auto& a:nums) { a1+=a; a2+=a; p.push(a); } a1/=2; int mem=0; while(a1<a2) { double tmp=p.top()/2; p.pop(); a2-=tmp; p.push(tmp); mem++; } return mem; } };

3.3 LeetCode179. 最大数

题目的意思就是给我们一个数组,然后我们要用数组里面的数来组成一个最大的数。所以我们根据组合后数字的大小来排序。

我们看代码,因为知道是通过组合后数字的大小来排序,所以我们在这里就直接通过一个lambda 表达式,给sort重写排序规则,就可以做出来这道题了。

class Solution { public: string largestNumber(vector<int>& nums) { vector<string> str; for(auto& s:nums) str.push_back(to_string(s)); sort(str.begin(),str.end(),[](const string& s1,const string&s2){ return s1+s2>s2+s1; }); string tmp; for(auto& s:str) tmp+=s; if(tmp[0]=='0') return "0"; else return tmp; } };

Read more

告别“选择困难症”:我是如何用 AI Ping 实现大模型自由,还能省下 50% 成本的?

告别“选择困难症”:我是如何用 AI Ping 实现大模型自由,还能省下 50% 成本的?

告别“选择困难症”:我是如何用 AI Ping 实现大模型自由,还能省下 50% 成本的? * 写在最前面 * 场景一:从“写脚本卡壳”到“批量生成” * 场景二:开发路上的“万能插头” * 使用感受 * 一点小建议与期待 * 写在最后 🌈你好呀!我是 是Yu欸🚀 感谢你的陪伴与支持~ 欢迎添加文末好友🌌 在所有感兴趣的领域扩展知识,不定期掉落福利资讯(*^▽^*) 写在最前面 版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。 在这个大模型“百花齐放”甚至“百模大战”的时代,作为一名既要写代码开发,又要频繁输出技术内容(写博文、做视频)的开发者,我每天最大的烦恼就是: “今天这个任务,

By Ne0inhk
OpenClaw深度解析:“数字龙虾”何以引爆AI Agent时代?安全危机与未来之战

OpenClaw深度解析:“数字龙虾”何以引爆AI Agent时代?安全危机与未来之战

OpenClaw深度解析:“数字龙虾”何以引爆AI Agent时代?安全危机与未来之战 一只“龙虾”,正在搅动整个科技圈。 2026年3月,一款名为OpenClaw的开源AI智能体框架在中国科技圈引发了一场前所未有的“全民养虾热”。它的GitHub星标数突破27万,超越React和Linux登顶全球开源软件项目榜。黄仁勋在GTC 2026上高呼:“这是Agent时代的Windows,每个公司都需要有OpenClaw战略”。 但与此同时,中国互联网金融协会、工信部、国家互联网应急中心接连发布安全预警。有用户因AI幻觉痛失全部邮件,有企业因恶意技能被植入后门。 这只“数字龙虾”究竟是什么?它为何能掀起滔天巨浪?又将游向何方? 01 现象:OpenClaw引爆的“龙虾热” 2026年春天,科技圈最火的关键词无疑是OpenClaw。这款开源自动化智能体框架,让大语言模型第一次真正长出了能干活儿的“钳子”。 核心能力:从“会说话”到“会做事” 与传统对话式AI不同,OpenClaw能够直接操作浏览器、读取文件、调用API、运行脚本,甚至接入微信、飞书、钉钉等协作平台。

By Ne0inhk

AI视频制作完整流程指南

在AI技术飞速发展的今天,视频创作不再是专业团队的专属领域。本文将带你深入了解AI视频制作的完整流程,从最初的创意构思到最终的成品输出,让你也能轻松制作出高质量的AI视频作品。 目录 引言:AI视频制作的革命 第一步:内容生成 - 让AI理解你的创意 为什么内容生成是第一步? 大模型能为你做什么? 实战示例:从简单到详细 推荐的大语言模型 实用技巧 第二步:画面生成 - 从文字到视觉 2.1 分镜画面生成(AI绘图) 2.2 关键帧生成视频(图生视频) 第三步:剪辑 - 赋予视频生命 常用剪辑软件对比 常用剪辑手法详解 剪辑节奏控制 AI辅助剪辑功能 第四步:配音 - 让视频开口说话 AI配音软件对比 配音制作流程 进阶技巧:声音克隆 第五步:其他优化 - 完善细节

By Ne0inhk
【笔记】Windows 上安装 OpenCode AI 编码助理:从踩坑到成功的简单记录

【笔记】Windows 上安装 OpenCode AI 编码助理:从踩坑到成功的简单记录

Windows 上安装 OpenCode AI 编码助理:从踩坑到成功的简单记录 日期:2026 年 1 月 9 日 作者:AITechLab 大家好,我是 AITechLab。 最近在网上看到 OpenCode 这个开源 AI 编码助理(官网:https://opencode.ai/),它声称可以帮助开发者在终端或桌面模式下用 AI 写代码、调试项目,支持 75 多种模型,包括免费的开源模型,还强调隐私保护(不上传代码)。 OpenCode |开源AI编码代理 介绍及操作文档 |OpenCode 桌面版 | 版本 v1.1.6 ·Anomalyco/OpenCode 作为 Windows

By Ne0inhk