Java贪心算法详解:从入门到实战

一、什么是贪心算法?

1.1 通俗解释

贪心算法(Greedy Algorithm)是一种非常直观的算法思想。它的核心理念可以用一句话概括:

在每一步决策时,都选择当前看起来最好的选项,不考虑未来,也不回头修改之前的选择。

这就像一个"目光短浅"但"行动果断"的人——他只看眼前,每次都拿最好的,拿了就不后悔。

1.2 生活中的贪心思维

让我们用几个生活场景来理解贪心算法:

场景一:超市购物

你去超市,购物车只能装10件商品,你想让购物车里的商品总价值最高。

贪心做法:每次都挑货架上最贵的商品放进购物车,直到装满10件。

场景二:赶公交

你要从A地到B地,有很多条公交线路,每条线路耗时不同。

贪心做法:每到一个站点,都选择能最快到达下一个目标站点的公交车。

场景三:吃自助餐

你去吃自助餐,胃容量有限,想吃到最"值"的食物。

贪心做法:先吃最贵的海鲜、牛排,把便宜的主食留到最后(如果还吃得下的话)。

1.3 贪心算法的正式定义

从计算机科学的角度来说,贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。

关键特点:

  • 局部最优选择:每一步都选当前最好的
  • 不可撤销:做了选择就不会回头
  • 无后效性:当前的选择不会影响之前的选择

二、贪心算法的基本思路

2.1 解题步骤

用贪心算法解决问题,一般遵循以下步骤:

第一步:分析问题,确定贪心策略 ↓ 第二步:证明贪心策略的正确性(或举反例验证) ↓ 第三步:按照贪心策略对数据进行排序或预处理 ↓ 第四步:按顺序依次做出每一步的贪心选择 ↓ 第五步:将所有选择组合成最终结果

2.2 贪心算法的适用条件

并不是所有问题都能用贪心算法解决。能用贪心算法的问题需要满足两个性质:

(1)贪心选择性质

意思是:通过做出一系列局部最优的选择,能够得到全局最优解。

简单说就是:"每一步都选最好的,最后整体也是最好的。"

(2)最优子结构

意思是:问题的最优解包含了子问题的最优解。

简单说就是:"大问题的最优解,是由小问题的最优解组成的。"


三、Java实现贪心算法的基本模板

在Java中实现贪心算法,通常会用到以下技术:

3.1 常用的Java工具类

import java.util.Arrays; // 数组排序 import java.util.Collections; // 集合排序 import java.util.Comparator; // 自定义比较器 import java.util.PriorityQueue; // 优先队列(堆) import java.util.List; import java.util.ArrayList;

3.2 贪心算法的代码框架

public class GreedySolution { public int solve(int[] data) { // 第一步:按照贪心策略对数据进行预处理(通常是排序) Arrays.sort(data); // 或者自定义排序规则 // 第二步:初始化结果变量 int result = 0; // 第三步:遍历数据,依次做出贪心选择 for (int i = 0; i < data.length; i++) { // 判断当前元素是否满足选择条件 if (canSelect(data[i])) { // 做出贪心选择 result += data[i]; // 更新状态(如果需要) updateState(); } } // 第四步:返回最终结果 return result; } private boolean canSelect(int value) { // 判断逻辑 return true; } private void updateState() { // 状态更新逻辑 } }

四、经典例题一:找零钱问题

4.1 问题描述

这是最经典的贪心算法入门题目:

问题:假设你是一个收银员,需要找给顾客 n 元零钱。

你手上有面值为 100元、50元、20元、10元、5元、1元 的纸币,每种面值的数量都足够多。

请问:最少需要多少张纸币?

4.2 贪心策略分析

我们的直觉告诉我们:应该优先使用大面值的纸币

为什么呢?因为大面值的纸币能够更快地"消耗"掉需要找的金额。用一张100元,比用两张50元、或者十张10元都要"划算"。

所以贪心策略就是:每次都尽可能多地使用当前最大面值的纸币

4.3 手动模拟过程

假设需要找零186元

步骤考虑面值计算过程使用张数剩余金额
1100元186 ÷ 100 = 1 余 861张86元
250元86 ÷ 50 = 1 余 361张36元
320元36 ÷ 20 = 1 余 161张16元
410元16 ÷ 10 = 1 余 61张6元
55元6 ÷ 5 = 1 余 11张1元
61元1 ÷ 1 = 1 余 01张0元

最终结果:100×1 + 50×1 + 20×1 + 10×1 + 5×1 + 1×1 =6张纸币

4.4 Java代码实现

import java.util.HashMap; import java.util.Map; /** * 找零钱问题 - 贪心算法实现 * * 问题:给定需要找零的金额,使用最少数量的纸币完成找零 * 贪心策略:优先使用大面值的纸币 */ public class CoinChange { // 可用的纸币面值(从大到小排列) private static final int[] COINS = {100, 50, 20, 10, 5, 1}; /** * 计算最少需要多少张纸币 * * @param amount 需要找零的金额 * @return 包含每种面值使用数量的Map,以及总张数 */ public static Map<String, Object> makeChange(int amount) { // 用于记录每种面值使用了多少张 Map<Integer, Integer> result = new HashMap<>(); // 记录总共使用的纸币张数 int totalCount = 0; // 记录剩余需要找零的金额 int remaining = amount; System.out.println("====== 找零过程演示 ======"); System.out.println("需要找零金额:" + amount + "元\n"); // 贪心选择:从大面值到小面值依次处理 for (int coin : COINS) { if (remaining >= coin) { // 计算当前面值能用多少张 int count = remaining / coin; // 记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1141436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[特殊字符]_可扩展性架构设计:从单体到微服务的性能演进[20260110164857]

作为一名经历过多次系统架构演进的老兵&#xff0c;我深知可扩展性对Web应用的重要性。从单体架构到微服务&#xff0c;我见证了无数系统在扩展性上的成败。今天我要分享的是基于真实项目经验的Web框架可扩展性设计实战。 &#x1f4a1; 可扩展性的核心挑战 在系统架构演进过…

framebuffer在工业HMI中的应用:入门必看

从显存到屏幕&#xff1a;用 framebuffer 打造工业级 HMI 的底层逻辑你有没有遇到过这样的场景&#xff1f;一台数控机床开机后&#xff0c;屏幕黑着等了五六秒才弹出操作界面&#xff1b;或者在 PLC 控制柜前轻点触摸屏&#xff0c;按钮响应慢半拍&#xff0c;让人怀疑是不是设…

vivado2022.2安装全流程图文并茂的系统学习资料

Vivado 2022.2 安装实战全攻略&#xff1a;从零搭建高效 FPGA 开发环境 你是否曾因为 Vivado 安装失败而耽误项目进度&#xff1f;是否在下载器卡在 0% 时束手无策&#xff1f;又或者&#xff0c;好不容易装上了却提示“License Checkout Failed”&#xff1f; 别担心&#x…

nginx中的proxy_set_header参数详解

在使用 Nginx 作为反向代理服务器时&#xff0c;proxy_set_header 指令扮演着至关重要的角色。它允许我们自定义请求头信息&#xff0c;将客户端请求传递给上游服务器时&#xff0c;添加或修改特定的信息&#xff0c;从而实现更灵活的代理功能。本文将深入探讨 proxy_set_heade…

【MiniMax】基于FastAPI + LangGraph + LLM大语言模型的通用Agent多智能体系统

基于 FastAPI + LangGraph + LLM 大语言模型的通用 Agent 多智能体系统架构设计与开发实战、产业应用 文章目录 基于 FastAPI + LangGraph + LLM 大语言模型的通用 Agent 多智能体系统架构设计与开发实战、产业应用 内容简介 第一部分:理论基础与技术栈概览 第1章 从大语言模型…

⚡_实时系统性能优化:从毫秒到微秒的突破[20260110165821]

作为一名专注于实时系统性能优化的工程师&#xff0c;我在过去的项目中积累了丰富的低延迟优化经验。实时系统对性能的要求极其严格&#xff0c;任何微小的延迟都可能影响系统的正确性和用户体验。今天我要分享的是在实时系统中实现从毫秒到微秒级性能突破的实战经验。 &#…

Nginx中$http_host、$host、$proxy_host的区别

知识巩固&#xff01; 网上看到这篇文章&#xff0c;这里转载记录一下。 简介 变量 是否显示端口 值是否存在 host 浏览器请求的ip&#xff0c;不显示端口 否 "Host:value"显示 值为a:b的时候&#xff0c;只显示a http_host 浏览器请求的ip和端口号 是 “Host:value”…

【Java线程安全实战】⑧ 阶段同步的艺术:Phaser 与 Condition 的高阶玩法

&#x1f4d6;目录1. 为什么需要Phaser和Condition&#xff1f;2. Phaser&#xff1a;动态阶段同步的智能调度系统2.1 Phaser的核心概念2.2 Phaser与CyclicBarrier的对比2.3 Phaser的典型应用场景3. Condition&#xff1a;线程的"个人等待区"3.1 Condition的核心概念…

基于ARM架构的Bootloader设计:完整指南

深入ARM架构的启动心脏&#xff1a;手把手构建可靠Bootloader你有没有遇到过这样的场景&#xff1f;板子上电&#xff0c;电源正常&#xff0c;晶振起振&#xff0c;但串口就是“哑巴”——一串乱码都没有。或者系统偶尔能启动&#xff0c;大多数时候却卡在某个阶段不动了。这类…

数据库事务隔离级别与Spring传播行为深度解析

本文共计约11000字&#xff0c;预计阅读时间25分钟。干了13年Java开发&#xff0c;我可以明确告诉你&#xff1a;事务问题是线上最隐蔽的bug来源。很多人以为加了Transactional就万事大吉&#xff0c;结果数据不一致、死锁、性能问题接踵而至。今天咱们就彻底搞清楚事务隔离级别…

vivado安装教程(Windows):完整版系统配置说明

Vivado安装全攻略&#xff1a;从零搭建高效FPGA开发环境&#xff08;Windows版&#xff09; 你是不是也曾在深夜试图安装Vivado&#xff0c;结果卡在“Error writing to file”上反复重试&#xff1f;或者好不容易装完&#xff0c;一启动就弹出“Could not start the Xilinx L…

AFM | 分布式光纤感知赋能水下智能柔顺抓取

近日&#xff0c;实验室在国际权威期刊Advanced Functional Materials&#xff08;中科院一区Top&#xff0c;影响因子 19.0&#xff09;上发表题为 “A Function-Structure-Integrated Optical Fingertip with Rigid-Soft Coupling Enabling Self-Decoupled Multimodal Underw…

Nginx如何实现 TCP和UDP代理?

文章目录 前言 Nginx之TCP和UDP代理 工作原理示意图 配置文件和命令参数注释 基本命令 配置实例说明 TCP代理实例UDP代理实例 总结 前言 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;同时也支持TCP/UDP代理。在1.9.13版本后&#xff0c;Nginx已经支持端口转发&…

高效构建权重矩阵 ContW 函数实现详解

在机器学习和数据挖掘领域,尤其涉及大规模数据集时,构建相似性权重矩阵 W 往往是计算瓶颈。传统的全连接图方法复杂度高,难以扩展。ContW 函数提供了一种高效的基于锚点的近似方法,通过选择少量锚点并计算局部最近邻权重,来构建稀疏表示矩阵 Z 和归一化矩阵 H,最终隐式得…

IMGConverter:轻量全能的图片格式转换处理神器 ,轻松转换为bmp,gif,heif,ico,jpeg,jpg,png .webp

轻量全能的图片格式转换处理神器IMGConverter软件&#xff0c;无需复杂操作&#xff0c;就能一站式解决图片格式转换、批量处理、轻度编辑等需求&#xff0c;兼顾效率与实用性&#xff0c;无论是日常使用还是专业场景都能轻松适配。IMGConverter&#xff1a;轻量全能的图片格式…

基于Simulink的光储系统动态电压恢复仿真

目录 手把手教你学Simulink 一、引言:为什么需要“动态电压恢复”? 二、光储DVR系统架构总览 核心思想: 三、关键模块1:光伏阵列与MPPT 光伏输出特性(单二极管模型简化): MPPT 算法:扰动观察法(P&O) 四、关键模块2:锂电池储能模型 SOC 更新: 五、关键…

【2026亲测】彻底禁止Windows 10/11自动更新,让电脑暂停更新10年!

你是否厌倦了Windows系统在工作或游戏时突然弹出的“正在更新”提示&#xff1f;虽然微软推送更新是为了安全&#xff0c;但在实际体验中&#xff0c;频繁的强制重启、更新后的驱动不兼容、甚至突如其来的“蓝屏死机”&#xff0c;让无数用户头疼不已。 更让人无奈的是&#xf…

JFlash下载调试模式配置:SWD接口连接与参数设定详解

JFlash SWD 调试实战指南&#xff1a;从连接失败到一键量产的全过程解析你有没有遇到过这样的场景&#xff1f;新板子焊好&#xff0c;兴冲冲接上J-Link&#xff0c;打开JFlash点击“Connect”&#xff0c;结果弹出一行红字&#xff1a;“No device found”&#xff1f;或者好…

Matlab实现GNMF测试阶段投影:将新数据映射到低维表示

在实际应用非负矩阵分解(NMF)或图正则化非负矩阵分解(GNMF)时,我们通常会先在训练集上学习基矩阵U,然后面对新来的测试数据时,需要快速得到其在同一低维空间中的表示V。这就是out-of-sample或测试阶段投影问题。 标准的NMF在测试阶段可以通过简单的非负最小二乘求解,但…

SSD1306 I2C模式下响应检测与错误处理核心要点

如何让 SSD1306 OLED 屏在 I2C 总线上“永不掉线”&#xff1f;——从响应检测到容错恢复的实战指南你有没有遇到过这样的场景&#xff1a;设备上电后&#xff0c;OLED 屏一片漆黑&#xff0c;而其他功能一切正常&#xff1f;或者系统运行几小时后&#xff0c;I2C 总线突然“卡…