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

贪心算法实战:三道经典 LeetCode 题解与思路分析

贪心算法核心在于每一步选择当前最优解以期望达到全局最优。通过柠檬水找零、数组和减半及最大数拼接三道 LeetCode 真题,演示如何运用状态追踪、大根堆及自定义字符串排序策略解决问题。代码包含 Java 完整实现,重点解析了边界情况处理与逻辑细节,适合算法进阶学习。

MongoKing发布于 2026/3/30更新于 2026/8/1741 浏览
贪心算法实战:三道经典 LeetCode 题解与思路分析

一、柠檬水找零

题目解析

这道题的核心在于模拟收银过程。每位顾客只能按顺序购买,且柠檬水固定 5 元。我们需要判断在收到不同面额(5、10、20)时,能否正确找零。

需要特别留意的是:

  1. 初始状态没有现金,如果第一位顾客给的不是 5 元,直接无法找零。
  2. 必须保证每一位顾客都能被满足,一旦某位无法找零,后续流程无需继续。
  3. 顾客给出的面额仅限于 5、10、20 三种。

算法原理

这是一个典型的贪心策略问题。当收到 20 元时,优先使用一张 10 元和一张 5 元找零,因为 5 元更通用(可用于找 10 元和 20 元),而 10 元只能用于找 20 元。维护两种面额的库存即可。

贪心找零逻辑示意图

代码实现

class Solution {
    public boolean lemonadeChange(int[] bills) {
        if (bills[0] != 5) {
            return false;
        }
        int five = 0, ten = 0;
        for (int bill : bills) {
            if (bill == 5) {
                five++;
            } else if (bill == 10) {
                if (five == 0) return false;
                five--;
                ten++;
            } else {
                // 收到 20 元,优先消耗 10 元 +5 元
                if (ten > 0 && five > 0) {
                    ten--;
                    five--;
                }   (five >= ) {
                    five -= ;
                }  {
                     ;
                }
            }
        }
         ;
    }
}
else
if
3
3
else
return
false
return
true

二、将数组和减半的最少操作次数

题目解析

题意很直观:每次选择一个数将其减半,目标是让总和减少一半所需的操作次数最少。

算法原理

为了让总和下降最快,每次操作都应该针对当前数组中的最大值进行减半。这提示我们使用大根堆(优先队列)来动态维护元素的最大值。

具体步骤如下:

  1. 将所有元素放入最大堆中,并计算初始总和。
  2. 每次取出堆顶最大值,将其减半后放回堆中,同时从总和中减去减半的数值。
  3. 重复上述过程直到总和减少量达到目标值。

代码实现

class Solution {
    public int halveArray(int[] nums) {
        PriorityQueue<Double> pq = new PriorityQueue<>((a, b) -> Double.compare(b, a));
        double sum = 0;
        for (int num : nums) {
            double val = (double) num;
            sum += val;
            pq.offer(val);
        }
        
        double target = sum / 2.0;
        double reducedSum = 0;
        int operations = 0;
        
        while (reducedSum < target) {
            double maxVal = pq.poll();
            double half = maxVal / 2.0;
            reducedSum += half;
            pq.offer(half);
            operations++;
        }
        return operations;
    }
}

三、最大数

题目解析

给定一组非负整数,将它们排列成拼接后的最大整数字符串形式。

算法原理

关键在于自定义排序规则。对于两个数字字符串 a 和 b,如果 a + b > b + a,则 a 应该排在 b 前面。通过这种比较方式对数组排序,最后拼接即可得到结果。

需要注意边界情况:如果排序后第一个字符是 '0',说明所有数字都是 0,直接返回 "0" 即可。

代码实现

class Solution {
    public String largestNumber(int[] nums) {
        int n = nums.length;
        String[] strs = new String[n];
        for (int i = 0; i < n; i++) {
            strs[i] = String.valueOf(nums[i]);
        }
        
        Arrays.sort(strs, (a, b) -> (b + a).compareTo(a + b));
        
        StringBuilder sb = new StringBuilder();
        for (String s : strs) {
            sb.append(s);
        }
        
        if (sb.charAt(0) == '0') {
            return "0";
        }
        return sb.toString();
    }
}

目录

  1. 一、柠檬水找零
  2. 题目解析
  3. 算法原理
  4. 代码实现
  5. 二、将数组和减半的最少操作次数
  6. 题目解析
  7. 算法原理
  8. 代码实现
  9. 三、最大数
  10. 题目解析
  11. 算法原理
  12. 代码实现
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 2026 年 2 月 AIGC 行业模型发布及前沿资讯汇总
  • RTX 4090 本地部署腾讯混元与阿里通义万相视频模型
  • OpenClaw 赋能机器人,AI 代理实现具身智能与远程操控
  • Java 开发者转型人工智能指南:优势、薪资与学习路径
  • HuggingFace 大模型微调与在线推理基础教程
  • MiniMax 海螺 AI 视频:图片与文本生成高质量视频
  • 自然语言处理在金融领域的应用与实战
  • 转行 AI 产品经理的核心能力与路径指南
  • ChatGPT 记忆功能揭秘:使用与管理指南
  • Photoshop 集成 ComfyUI AI 绘画功能指南
  • LeetCode 128:哈希集合巧解最长连续序列
  • AI Agent 自动化工作流系统架构与实现
  • Qwen3-VL-WEBUI 部署与 Qwen3-VL-4B-Instruct 高效推理实践
  • Python tkinter 实现随机生日祝福弹窗实战
  • 人工智能大模型技术白皮书
  • 基于 Docker 部署 FastGPT 与本地大模型实战指南
  • LLM 从任务结构到世界模型:LLMs 究竟拥有何种知识
  • HTML 标签详解:构建网页骨架的核心语法与用法
  • Java 算法基础实战:输入输出与格式化控制详解
  • 风险投资计划(华为 OD 算法题)

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

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

  • Gemini 图片去水印

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