跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

贪心算法基础:局部最优实现全局最优

介绍贪心算法的核心思想,即每一步选择当前最优解以期望达到全局最优。文章阐述了贪心算法的解题步骤,包括问题拆解、确定策略、验证可行性及代码实现。通过三个 LeetCode 例题(柠檬水找零、将数组和减半的最少操作次数、最大数)展示了贪心策略在不同场景下的应用与 C++ 代码实现,强调了经验在贪心设计中的重要性。

月光旅人发布于 2026/3/28更新于 2026/10/2092 浏览
贪心算法基础:局部最优实现全局最优

贪心算法

1. 什么是贪心算法

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

2. 贪心算法的解题步骤

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

注意:第三步最为关键。有些题目看似可以使用贪心,但实际不可行,因为局部最优不一定能达到全局最优解。贪心算法没有具体模版,需要根据每一题设计不同的思路,经验非常重要。

3. 具体例题及代码

3.1 LeetCode 860. 柠檬水找零

题目要求模拟实现找零,策略是每一次都尽量给大的零钱,这样可以确保只会出现零钱不够的情况,不会出现有钱但是无法使用的情况。

文章配图

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++;
                }   (a >= ) {
                    a -= ;
                    c++;
                }  {
                     ;
                }
            }
             (num == ) {
                 (a) {
                    a--;
                    b++;
                }  {
                     ;
                }
            }
             (num == ) {
                a++;
            }
        }
         ;
    }
};
else
if
3
3
else
return
false
if
10
if
else
return
false
if
5
return
true

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

题目要求最小次数地对数组里面的数除以 2,使数组和小于等于原先数组的一半。策略是每次找数组里面最大的数,然后给它减去一半。

文章配图

使用优先队列(大堆)可以快速取出最大值。每插入一个数都会对其进行排序,不断取出堆顶元素即可。

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

3.3 LeetCode 179. 最大数

题目的意思是用数组里面的数来组成一个最大的数。根据组合后数字的大小来排序。

文章配图

通过 lambda 表达式重写 sort 排序规则,比较 s1+s2 与 s2+s1 的大小。

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;
    }
};

目录

  1. 贪心算法
  2. 1. 什么是贪心算法
  3. 2. 贪心算法的解题步骤
  4. 3. 具体例题及代码
  5. 3.1 LeetCode 860. 柠檬水找零
  6. 3.2 LeetCode 2208. 将数组和减半的最少操作次数
  7. 3.3 LeetCode 179. 最大数

更多推荐文章

查看全部
  • 全球老龄化背景下的护理机器人发展研究
  • Spring Boot 数据可视化与图表集成实战
  • Java 线程池核心机制与调度原理
  • RISC-V 开源处理器实战:从 Verilog RTL 设计到 FPGA 原型验证
  • AI 辅助编程:需求对齐模式提升代码准确率
  • GLM-5 与 Qwen3.5 大模型 API 接入实战指南
  • GitHub Copilot、Cursor、JetBrains AI Assistant 使用实战指南
  • Typora 的安装与基础设置
  • 大模型插件与GPTs演进:GPT-4 Turbo特性及RAG、Agent应用解析
  • OpenClaw 接入 QVeris:为 AI 助手赋予实时数据查询能力
  • OpenClaw 龙虾机器人本地部署技术指南
  • NVIDIA DGX Spark 部署 Stable Diffusion 3.5 与 ComfyUI 实战
  • Midreal AI 工具深度解析:交互式小说生成与插图创作实践
  • 深入理解 IDE 中 LLM 调用的 Session 机制
  • 大模型应用开发:动手做 AI Agent 技术指南
  • 鸿蒙 Next 应用配置文件
  • HTTP 应用层协议详解与简易服务器实现
  • FPGA 摄像头采集处理显示指南:OV5640 到 HDMI 实时显示
  • Spring AI 集成 PGvector:向量存储与相似性搜索实战
  • Spring Web MVC 核心概念与实战详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online