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

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

目录

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

01_Dify开源版使用源代码本地启动

01_Dify开源版使用源代码本地启动

一、前提条件 1.1 硬件要求 在安装 Dify 之前,请确保您的设备符合以下最低系统要求: * CPU >= 2 核 * RAM >= 4 GiB 1.2 安装Docker和Docker Compose 👉 Ubuntu 安装Docker和Docker Compose图文教程 👉 Windows下DockerDesktop安装配置图文教程,含软件安装包 1.3 安装 Git 👉 Windows下Git安装配置及常用操作图文教程,含软件安装包 二、克隆 Dify 仓库 2.1 添加 Dify 的远程仓库 git remote add dify https://gitee.com/dify_ai/

By Ne0inhk

Cursor、Windsurf、Kiro、Zed、VS Code(含 Copilot) 等 AI 编程工具的 定价对比

以 USD/月为单位,2025 最新市场信息:(Windsurf) 1) Cursor(基于 VS Code 的 AI IDE) 计划价格主要特征免费 Hobby$0基础 completions / 请求额度有限,试用高级功能两周 (Bito)Pro$20/月无限 completions、约 500 高速 AI 请求 (Windsurf)Teams$40/用户/月团队协作、管理功能 (Windsurf)Ultra$200/月大量 AI 请求额度 (Bito)Enterprise自定义企业级安全与支持 (Bito) 特点:AI 多行补全、上下文理解强、Pro

By Ne0inhk
【优质开源项目】AIGC开源推荐-全球情报监控平台worldmonitor

【优质开源项目】AIGC开源推荐-全球情报监控平台worldmonitor

1.概述 World Monitor 是一个开源的实时情报/监测仪表盘,聚合多类数据源(新闻、地理/卫星、航运/空中、财经、威胁情报等),提供交互式地理视图、AI 摘要、事件聚合与报警,支持 Web / PWA / Tauri 桌面三种运行方式,并可通过变体(WORLD / TECH / FINANCE)切换功能集。 2. 总体技术架构(分层视角) 客户端层(Browser / PWA / Tauri desktop) * • React + TypeScript + Vite 构建。 * • 地图/可视化:deck.gl(WebGL 3D globe)、MapLibre GL、D3

By Ne0inhk

服务器环境 VsCode:Github Copilot 安装完成却用不了?关键步骤补全

GitHub Copilot在VS Code中无法使用的关键解决步骤 1. 基础环境检查 * VS Code版本:确保使用最新版(至少≥1.60),旧版可能导致兼容问题 * Copilot状态:在VS Code左侧活动栏点击Copilot图标(飞机形状),检查是否显示已登录和启用状态 * 网络环境:Copilot需访问GitHub服务器,尝试关闭代理或检查防火墙是否屏蔽api.github.com 2. 核心配置步骤 # 步骤1:检查Copilot是否激活 # 在VS Code命令面板(Ctrl+Shift+P)输入: > GitHub Copilot: Check Status # 步骤2:重置授权令牌(常见问题根源) > GitHub Copilot: Reset GitHub Copilot Token # 步骤3:强制刷新扩展 >

By Ne0inhk