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

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

目录

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

Flutter 组件 slug 的适配 鸿蒙Harmony 实战 - 驾驭文本语义规范化、实现鸿蒙端中英混合标题转规范化文件名与 URL 路径方案

Flutter 组件 slug 的适配 鸿蒙Harmony 实战 - 驾驭文本语义规范化、实现鸿蒙端中英混合标题转规范化文件名与 URL 路径方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 slug 的适配 鸿蒙Harmony 实战 - 驾驭文本语义规范化、实现鸿蒙端中英混合标题转规范化文件名与 URL 路径方案 前言 在鸿蒙(OpenHarmony)生态的电商产品展示、博客文章发布以及分布式文件存储系统的开发中,如何处理具备高度随机性、包含特殊字符甚至是多语言混合的“文本标题”是一个常见的工程痛点。面对用户输入的 鸿蒙 0307 批次:跨平台实战! 这种长标题。如果直接将其作为文件名保存,可能会因为文件系统对特殊符号(如冒号、感叹号)的限制导致报错;如果将其作为 URL 路径,则会产生由于繁琐的百分比编码(URL Encoding)导致的地址不可读问题。 我们需要一种“语义透明、路径友好”的转码艺术。 slug 是一套专注于将杂乱文本转化为极致精简、规范化短链(

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 platform_info 为鸿蒙多端应用提供精准的运行时环境感知(平台适配大脑)

Flutter for OpenHarmony: Flutter 三方库 platform_info 为鸿蒙多端应用提供精准的运行时环境感知(平台适配大脑)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 应用开发时,“环境感知”是一切进阶逻辑的基石。 * 当前是鸿蒙手机还是平板? * 应用是处于 Debug 调试态还是 Release 发布态? * 底层硬件到底有多少核处理器? 然而,由于 platform_info (v5.0.0) 尚未正式支持 OpenHarmony,直接调用会导致系统被识别为 Unknown,甚至让关键的 isMobile 判定失效。为了解决这一痛点,我们对该库进行了“手术级”的源码适配。 一、环境感知适配模型 我们将底层的系统标识符转化为 Flutter 开发者熟悉的强类型对象。 底层系统 ('ohos') 补丁适配层 (vm_host_platform) 强类型枚举

By Ne0inhk
Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石

Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石 前言 随着鸿蒙(OpenHarmony)生态向 PC 和平板端的高速扩张,如何为海量的三方软件建立一套标准化的“数字档案”,成了构建应用商店生态的核心痛点。过去,开发者提交应用信息时,往往采用碎片化的 JSON 或自定义文档。这会导致软件分发时详情页展示不一、多语言支持混乱,甚至连基本的截图和版本日志都难以对齐。 为了解决这个问题,我们需要引入一套具备全球化视野的元数据定义标准。appstream 作为 Linux 生态下最重要的应用信息描述规范,能够通过结构化的 XML 标签,精准定义软件的身世、功能和展示资产。适配到鸿蒙平台后,它不仅能让你的重型“鸿蒙私有应用商店”瞬间具备吞金般的解析能力,

By Ne0inhk

Flutter 三方库 http_status_code 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、工业级的网络响应审计与 HTTP 状态码语义化控制引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 http_status_code 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、工业级的网络响应审计与 HTTP 状态码语义化控制引擎 在鸿蒙(OpenHarmony)系统的端云一体化网络库封装、政企级应用的网络错误诊断、或者是针对复杂的 REST API 全生命周期监听中,如何摆脱凌乱的 magic number(如 404, 500),转而使用具备自描述性、且完全符合 RFC 规范的语义化常量?http_status_code 为开发者提供了一套工业级的、基于标准定义的 HTTP 状态码枚举与描述查询方案。本文将深入实战其在鸿蒙网络安全架构中的应用。 前言 什么是 HTTP Status Code?它是 Web

By Ne0inhk