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

贪心算法实战:柠檬水找零、数组减半与最大数拼接

贪心算法核心在于局部最优选择。本文通过三道经典力扣题解析其应用:柠檬水找零需优先使用大额找零;数组和减半利用大根堆每次削减最大值;最大数拼接则依赖自定义字符串排序规则。掌握这些策略有助于高效解决特定优化问题。

极光发布于 2026/3/30更新于 2026/6/1324 浏览
贪心算法实战:柠檬水找零、数组减半与最大数拼接

一、力扣 860. 柠檬水找零

1. 题目解析

题意可理解为:每位顾客按顺序购买柠檬水,价格固定为 5 元。你需要根据收到的账单顺序正确找零。

需要注意几个关键点:

  • 初始时你没有任何现金,如果第一位顾客给的不是 5 元,直接无法找零。
  • 必须确保当前顾客能正常找零,否则立即返回失败,无需继续处理后续订单。
  • 顾客支付的面额只有 5 元、10 元和 20 元三种。

2. 算法原理

在这里插入图片描述

3. 代码

class Solution {
    int[] change;
    public boolean lemonadeChange(int[] bills) {
        if (bills[0] != 5) {
            return false;
        }
        change = new int[2];
        for (int i = 0; i < bills.length; i++) {
            if (bills[i] == 5) {
                change[0]++;
            } else if (bills[i] == 10) {
                if (change[0] != 0) {
                    change[0]--;
                    change[1]++;
                } else {
                     ;
                }
            }  {
                 (change[] !=  && change[] != ) {
                    change[]--;
                    change[]--;
                }   (change[] >= ) {
                    change[] -= ;
                }  {
                     ;
                }
            }
        }
         ;
    }
}
return
false
else
if
0
0
1
0
0
1
else
if
0
3
0
3
else
return
false
return
true

二、力扣 2208. 将数组和减半的最少操作次数

1. 题目解析

题意即通过最少的操作次数,使数组元素之和减少到原来的一半。每次操作可以将任意一个元素除以 2。

2. 算法原理

核心策略非常直观:为了让总和下降最快,每次都应该选择当前最大的元素进行减半。

为了实现这一点,我们需要一个大根堆(优先队列),将所有元素放入其中。每次取出堆顶最大值,减半后再放回堆中,直到总和满足条件。

3. 代码

class Solution {
    public int halveArray(int[] nums) {
        PriorityQueue<Double> q = new PriorityQueue<>((a, b) -> b.compareTo(a));
        double sum = 0;
        for (int x : nums) {
            sum += x;
            q.offer((double) x);
        }
        int ret = 0;
        sum /= 2.0;
        while (sum > 0) {
            double t = q.poll() / 2.0;
            sum -= t;
            q.offer(t);
            ret++;
        }
        return ret;
    }
}

三、力扣 179. 最大数

1. 题目解析

给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数并返回字符串形式。

在这里插入图片描述

2. 算法原理

这道题的关键在于确定排序规则。我们不能简单地按数值大小排序,而是要比较拼接后的结果。

假设数组中有两个数字 a 和 b,如果 ab(拼接)大于 ba,则 a 应该排在 b 前面;反之则 b 在前。基于这个自定义规则对数组排序后,依次拼接即可得到最大数。

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

3. 代码

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

目录

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

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

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

更多推荐文章

查看全部
  • 基于 Docker 部署 Ollama 与 Open-WebUI 本地大模型
  • 算法实战进阶:预处理、滑动窗口、前缀和与图论并查集应用
  • VSCode 接入智谱 GLM-4 与自定义大模型配置指南
  • Windows 程序启动失败:Visual C++ 运行库缺失修复方案
  • Z-Image-Turbo 生成写实图像技术指南
  • 微服务链路追踪实战:SkyWalking 与 Zipkin 架构解析及性能优化
  • 学术写作 AIGC 降重工具功能对比与选择指南
  • AndroidGen-Llama-3-70B:零标注自主操控安卓应用的大模型实践
  • VMware 中安装配置 Ubuntu 系统
  • 二分查找实战:旋转数组最小值与缺失数字查找
  • MySQL 迁移隐性成本分析与自动化工具链实战
  • 数据结构:单链表详解与 C 语言实现
  • C++ 二分查找算法详解与模板总结
  • 腾讯开源OpenTenBase企业级分布式HTAP数据库部署指南
  • Web 应用架构与安全漏洞基础学习
  • 基于 xxxwww 的电商爬虫系统实战与优化
  • 2026 届学位论文 AIGC 检测率要求及应对策略汇总
  • Java 核心面试题精选与解析
  • 网络安全学习路线与职业发展指南
  • web-print-pdf:基于 Playwright 的 Web 打印解决方案

相关免费在线工具

  • 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