程序员必须掌握的算法系列之贪心算法

news2025/1/12 22:51:08

一:引言

在计算机科学中,贪心算法(Greedy Algorithm)是一种基于贪心策略的算法思想,它在每一步选择中都采取当前状态下最优的选择,以希望最终能够得到全局最优解。贪心算法通常可以在较短的时间内找到问题的近似最优解,尤其适用于解决一些优化问题或拟合问题。

贪心算法在程序员的日常开发中非常常见,这是因为贪心算法能够快速得到一个可行解,在某些特定场景下能够得到最优解或近似最优解。因此,作为一名程序员,掌握贪心算法是必不可少的。

二:常见贪心算法介绍

1. 找零钱问题

找钱问题
找零钱问题是贪心算法的经典问题之一。问题描述:给定一个金额和不同面额的硬币,要求找零钱时所需的硬币数量最少。贪心策略是每次选择面额最大的硬币进行找零。以下是Java代码示例:

public class Change{
    public static int findMinCoins(int[] coins, int amount) {
        Arrays.sort(coins);
        int count = 0;
        for (int i = coins.length - 1; i >= 0; i--) {
            while (amount >= coins[i]) {
                amount -= coins[i];
                count++;
            }
        }
        return count;
    }

    public static void main(String[] args) {
        int[] coins = {1, 5, 10, 25};
        int amount = 36;
        int minCoins = findMinCoins(coins, amount);
        System.out.println("最少需要 " + minCoins + " 枚硬币来找零 " + amount + " 元。");
    }
}

Python代码示例:

def find_min_coins(coins, amount):
    coins.sort(reverse=True)
    count = 0
    for coin in coins:
        while amount >= coin:
            amount -= coin
            count += 1
    return count

coins = [1, 5, 10, 25]
amount = 36
min_coins = find_min_coins(coins, amount)
print("最少需要", min_coins, "枚硬币来找零", amount, "元。")

2. 区间调度问题

在区间调度问题中,给定若干个区间,要求找到一个最大的互不重叠的子集。贪心策略是按照结束时间早的顺序对区间进行排序,然后从前往后依次选择互不重叠的区间。以下是Java代码示例:

public class IntervalSchedule{
    public static int findMaxNonOverlap(Inteval[] intervals){
        if(intervals == null || intervals.length == 0){
            return 0;
        }
        Arrays.sort(intervals, (a,b) -> a.end - b.end); // 按照结束时间排序
        int count = 1; // 至少有一个互不重叠的区间
        int end = intervals[0].end;
        for(int i=1; i<intervals.length; i++){
            if(intervals[i].start >= end){
                count++;
                end = intervals[i].end;
            }
        }
        return count;
    }

    public static void main(String[] args){
        Interval[] intervals = new Interval[4];
        intervals[0] = new Interval(1, 3);
        intervals[1] = new Interval(2, 4);
        intervals[2] = new Interval(3, 5);
        intervals[3] = new Interval(4, 6);
        int maxNonOverlap = findMaxNonOverlap(intervals);
        System.out.println("最多能够安排" + maxNonOverlap + "个互不重叠的区间。");
    }
}

Python代码示例:

class Interval:
    def __init__(self, start, end):
        self.start = start
        self.end = end

def find_max_non_overlap(intervals):
    intervals.sort(key=lambda x: x.end)  # 按照结束时间排序
    count = 1  # 至少有一个互不重叠的区间
    end = intervals[0].end
    for i in range(1, len(intervals)):
        if intervals[i].start >= end:
            count += 1
            end = intervals[i].end
    return count

intervals = []
intervals.append(Interval(1, 3))
intervals.append(Interval(2, 4))
intervals.append(Interval(3, 5))
intervals.append(Interval(4, 6))
max_non_overlap = find_max_non_overlap(intervals)
print("最多能够安排", max_non_overlap, "个互不重叠的区间。")

三:重点算法总结

贪心算法作为程序员必须掌握的重要算法之一,常用于解决优化问题或拟合问题。在日常开发中,程序员常常会遇到需要找到最优解或近似最优解的情况,这时候贪心算法能够提供一种快速解决方案。

除了上面介绍的找零钱问题和区间调度问题外,贪心算法还有许多其他常见的应用,如霍夫曼编码、最小生成树等。对于程序员来说,掌握不同场景下的贪心算法,并能够熟练地使用相关的编程语言实现算法是至关重要的。

因此,作为一名程序员,我们应该不断学习和深入研究算法领域,掌握各种常见的贪心算法,提升自己解决问题的能力和效率。通过不断学习和实践,我们将能够更好地应对各种算法问题,为解决实际应用中的复杂问题提供有效的解决方案。

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

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

相关文章

springcloud3 分布式事务实现逻辑思想2

一 分布式事务逻辑 1.1 CAP理论 CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;Consistency&#xff08;一致性&#xff09;、 Availability&#xff08;可用性&#xff09;、Partition tolerance&#xff08;分区容错性&#xff09;这3个基本需求&…

SPI在Java中的实现与应用 | 京东物流技术团队

1 SPI的概念 API API在我们日常开发工作中是比较直观可以看到的&#xff0c;比如在 Spring 项目中&#xff0c;我们通常习惯在写 service 层代码前&#xff0c;添加一个接口层&#xff0c;对于 service 的调用一般也都是基于接口操作&#xff0c;通过依赖注入&#xff0c;可以…

【深度学习实验】前馈神经网络(六):自动求导

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 标量求导 2. 矩阵求导 3. 计算图 一、实验介绍 PyTorch提供了自动求导机制&#xff0c;它是PyTorch的核心功能之一&#xff0c;用于计算梯度并进行反向传播。自动求…

C++流插入和流提取的重载!

C作为C语言的衍生&#xff0c;其弥补了C语言中的很多不足&#xff0c;也对C语言进行了一定的优化&#xff01;今日就来讲解一下C中输入/出流相关的知识&#xff01;以及对输入/出的重载&#xff01;&#xff0c;希望读完本篇文章&#xff0c;能让读者们对C中输入/出流有更深一步…

Java之IO概述以及

1.1 什么是IO 生活中&#xff0c;你肯定经历过这样的场景。当你编辑一个文本文件&#xff0c;忘记了ctrls &#xff0c;可能文件就白白编辑了。当你电脑上插入一个U盘&#xff0c;可以把一个视频&#xff0c;拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢&#xff1f;键…

散列(哈希)查找的定义,常见的散列函数设计以及处理哈希冲突方法

1.散列表 1.散列表的定义 散列表(Hash Table)&#xff0c;又称哈希表。 是一种数据结构&#xff0c;特点是:数据元素的关键字与其存储地址直接相关。 特点&#xff1a; 若不同的关键字通过散列函数映射到同一个值&#xff0c;则称它们为“同义词”。通过散列函数确定的位置…

Maven 设置环境变量(Windows、Linux)

文章目录 Windows 配置 Maven 环境变量Linux 配置 Maven 环境变量 如果想在任意路径下都能通过 mvn 命令运行 Maven 程序&#xff0c;就需要将 Maven 程序路径设置到环境变量中&#xff0c; 否则使用 mvn 命令时每次都要加上 Maven 程序的全路径 核心就一句话&#xff0c;把 M…

坚鹏:中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期

中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力&#xff0c;是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市&#xff0c;2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…

学习记忆——英语篇——右脑记忆单词

文章目录 英语字母形象起源右脑记忆单词的原则四大步骤第一步&#xff1a;摄取信息第二步&#xff1a;处理信息第三步&#xff1a;储存信息第四步&#xff1a;提取信息 训练例子字母形象训练 右脑记忆单词5大方法字源法编码法字母编码法字母组合编码法 拼音法全拼法拼音组合 熟…

springcloud3 分布式事务解决方案seata之XA模式4

一 seata的模式 1.1 seata的几种模式比较 Seata基于上述架构提供了四种不同的分布式事务解决方案&#xff1a; XA模式&#xff1a;强一致性分阶段事务模式&#xff0c;牺牲了一定的可用性&#xff0c;无业务侵入 TCC模式&#xff1a;最终一致的分阶段事务模式&#xff0c;有…

操作系统:中断和异常

1.中断的作用 CPU上会运行两种程序&#xff0c;一种是操作系统内核程序&#xff08;是整个系统的管理者&#xff09;&#xff0c;一种是应用程序。 1.中断的特点 在合适的情况下&#xff0c;操作系统内核会把CPU的使用权主动让给应用程序。“中断”是让操作系统内核夺回CPu使…

java智慧园区系统源码 智慧园区小程序源码

java智慧园区系统源码 智慧园区小程序源码 技术框架&#xff1a; 核心框架&#xff1a;Spring Boot 2.4.0 安全框架&#xff1a;JwtPermission 3.1.1 前端&#xff1a;Ant Design Vue 1.6.2 持久层框架&#xff1a;MyBatis-Plus 3.4.1 关系型数据库: Mysql 8.0.22 数据库…

【开发篇】一、热部署

文章目录 1、手工启动热部署2、自动启动热部署3、热部署范围配置4、关闭热部署功能 1、手工启动热部署 日常开发与调试&#xff0c;改几行代码想看效果就得手动点重启&#xff0c;很繁琐&#xff0c;接下来考虑启动热部署。首先引入springboot开发者工具&#xff1a; <dep…

找视频背景音乐素材,就上这6个网站。

找背景音乐、BGM、音效素材&#xff0c;就上这6个网站&#xff0c;国内外都有&#xff0c;免费下载&#xff0c;还可以商用&#xff0c;建议收藏起来~ 1、菜鸟图库 https://www.sucai999.com/audio.html?vNTYwNDUx 菜鸟图库是一个综合性素材网站&#xff0c;站内涵盖设计、图…

ceph分布式存储部署

一、概述 是一个统一的分布式存储系统&#xff0c;设计初衷是提供较好的性能、可靠性和可扩展性。 特点 1、统一存储 虽然 ceph 底层是一个分布式文件系统&#xff0c;但由于在上层开发了支持对象和块的接口。所以在开源存储软件中&#xff0c;能够一统江湖。至于能不能千秋万…

单片机学习--->Keil多文件工程

1、在文件夹中创建新的文件夹 目录&#xff1a; App 文件夹&#xff1a;用于存放外设驱动文件&#xff0c;如 LED、数码管、定时器等。 Obj 文件夹&#xff1a;用于存放编译产生的 c/汇编/链接的列表清单、调试信息、 hex 文件、预览信息、封装库等文件。 Public 文件夹&#x…

D. Edge Split

Problem - D - Codeforces 思路&#xff1a;思路想到了&#xff0c;但是不知道用什么方法写。。首先我们先看只有一个树的情况&#xff0c;那么如果我们所有的边是一个颜色&#xff0c;那么答案是1n&#xff0c;如果我们将其中的一条边变色&#xff0c;那么产生的答案是2n-1&am…

buuctf web [ACTF2020 新生赛]Upload

明了但不明显的文件上传 传个试试 行&#xff0c;抓包吧&#xff0c;php格式不行&#xff0c;就先上传要求的格式&#xff1a;jpg、png、gif 抓到上传的包之后&#xff0c;再修改成我们想要的 常见的php格式绕过有&#xff1a;php,php3,php4,php5,phtml,pht 挨个试试 这是上个…

Python 根据身高体重计算体质(BMI)指数

""" 根据身高体重计算体质(BMI)指数知识点&#xff1a;1、计算公式&#xff1a;体质指数(BMI) 体重(KG) / (身高(M) * 身高(M))2、变量类型转换3、运算符幂**&#xff0c;例如&#xff1a;3 ** 2 9 <> 3 * 34、更多的运用请参考&#xff1a;https://blo…

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow环境PyQt5环境 模块实现1. 数据预处理 相关其它博客工程源代码下载其它资料下载 前言 本项目采用了矩阵分解算法&#xff0c;用于对玩家已游玩的数据进行深入分析。它的目标是从众多游戏中筛选出最适合…