贪心算法专练

news2024/11/23 15:42:03

请添加图片描述
⭐️前言⭐️

本篇文章主要分享几道贪心算法的题目,贪心算法是一种基于自然智慧的算法,这类题目并没有统一的解法,但通常都是每一步做出一个局部最优的选择,最终的结果就是全局最优。

🍉欢迎点赞 👍 收藏留言评论 📝私信必回哟😁

🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

🍉博客中涉及源码及博主日常练习代码均已上传GitHub


请添加图片描述

📍内容导读📍

  • 🍅字典序最小
  • 🍅会议安排
  • 🍅分金条
  • 🍅最大钱数
  • 🍅安灯

🍅字典序最小

题目:
给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果。

代码实现:

public class LowestString {
    public static class MyComparator implements Comparator<String> {

        @Override
        public int compare(String o1, String o2) {
            return (o1+o2).compareTo(o2+o1);
        }
    }
    
    public static String lowestString(String[] strs) {
        if(strs==null||strs.length==0) {
            return "";
        }
        Arrays.sort(strs,new MyComparator());
        StringBuilder res=new StringBuilder();
        for (int i = 0; i < strs.length; i++) {
            res.append(strs[i]);
        }
        return res.toString();
    }
}

🍅会议安排

题目:
一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲,给你每一个项目开始的时间和结束的时间
你来安排宣讲的日程,要求会议室进行的宣讲的场次最多,返回最多的宣讲场次

题解思路:
贪心策略为按会议的结束时间排序,没有冲突的全部囊括即为最终结果。

代码实现:

public class BestArrange {
    public static class Program {
        public int start;
        public int end;

        public Program(int start, int end) {
            this.start = start;
            this.end = end;
        }
    }
    
    public static int bestArrange(Program[] programs) {
        Arrays.sort(programs, new Comparator<Program>() {
            @Override
            public int compare(Program o1, Program o2) {
                return o1.end-o2.end;
            }
        });
        int timeLine=0;
        int result=0;
        // 依次遍历每一个会议,结束时间早的会议优先遍历
        for (int i = 0; i < programs.length; i++) {
            if(timeLine<=programs[i].start) {
                result++;
                timeLine=programs[i].end;
            }
        }
        return result;
    }
}

🍅分金条

题目:
一块金条切成两半,是需要花费和长度数值一样的铜板
比如长度为20的金条,不管怎么切都要花费20个铜板,一群人想整分整块金条,怎么分最省铜板?
例如,给定数组{10,20,30},代表一共三个人,整块金条长度为60,金条要分成10,20,30三个部分。
如果先把长度60的金条分成10和50,花费60;再把长度50的金条分成20和30,花费50;一共花费110铜板
但如果先把长度60的金条分成30和30,花费60;再把长度30金条分成10和20,花费30;一共花费90铜板
输入一个数组,返回分割的最小代价。
题解思路:
哈夫曼编码思想,借助优先级队列(小根堆),每次弹出两个数,合成一个数后再放入队列,直到最终队列中的数变为数组总和。
耗费的代价即为圈中数字和。

在这里插入图片描述

代码实现:

public class LessMoney {
    public static int lessMoney(int[] arr) {
        PriorityQueue<Integer> queue=new PriorityQueue<>();
        for (int i = 0; i < arr.length; i++) {
            queue.add(arr[i]);
        }
        int sum=0;
        int cur=0;
        while (queue.size()>1) {
            cur=queue.poll()+queue.poll();
            sum+=cur;
            queue.offer(cur);
        }
        return sum;
    }
}

🍅最大钱数

题目:
输入正数数组costs、正数数组profits、正数K和正数M
costs[i]表示i号项目的花费
profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润)
K表示你只能串行的最多做k个项目
M表示你初始的资金
说明:每做完一个项目,马上获得的收益,可以支持你去做下一个项目,不能并行的做项目。
输出:最后获得的最大钱数
题解思路:
需要两个数据结构,一个是小根堆(以花费做比较),另一个是大根堆(以利润做比较)
根据M来解锁小根堆中可以做的项目,让其进入大根堆,然后大根堆弹出堆顶元素,M变动,数量++,重新之前的操作,直到数量到达K。
(思路来源于打怪升级的过程,在能力范围内,找能提升等级最大的怪打,打完以后再用新的能力来权衡能提升等级最大的怪)
代码实现:

public class IPO {
    public static class Program {
        public int cost;
        public int profit;

        public Program(int profit, int cost) {
            this.cost = cost;
            this.profit = profit;
        }
    }

    public static int findMaximizedCapital(int K,int W,int[] costs,int[] profits) {
        PriorityQueue<Program> minCostQueue=new PriorityQueue<>(new Comparator<Program>() {
            @Override
            public int compare(Program o1, Program o2) {
                return o1.cost- o2.cost;
            }
        });
        PriorityQueue<Program> maxProfitQueue=new PriorityQueue<>(new Comparator<Program>() {
            @Override
            public int compare(Program o1, Program o2) {
                return o2.profit- o2.profit;
            }
        });
        for (int i = 0; i < costs.length; i++) {
            minCostQueue.add(new Program(costs[i],profits[i]));
        }
        for (int i = 0; i < K; i++) {
            while (!minCostQueue.isEmpty()&&minCostQueue.peek().cost<=W) {
                maxProfitQueue.add(minCostQueue.poll());
            }
            if(maxProfitQueue.isEmpty()) {
                return W;
            }
            W+=maxProfitQueue.poll().profit;
        }
        return W;
    }
}

🍅安灯

题目:
给定一个字符串str,只由’X’和’.'两种字符构成
‘X’表示墙,不能放灯,也不需要点亮;’.'表示居民点,可以放灯,需要点亮
如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮
返回如果点亮str中所有需要点亮的位置,至少需要几盏灯
题解思路:
直接把字符串以"X"分割开来,因为只需要考虑居民点部分的照亮,一盏灯最多照亮三个点,所以就让每块分割开的字符串长度除以三,并向上取整,就是最终结果。
代码实现:

public static int minLight(String road) {
        String[] ss=road.split("X");
        int light=0;
        for(String s:ss) {
            light+=(s.length()+2)/3;
        }
        return light;
}

⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

请添加图片描述

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

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

相关文章

图神经网络:(化学领域)再次认识图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook和有关文献。超链。提取码8848。 文章目录 Mutagenicity数据集搭建模型训练模型文献阅读重新回来 Mutagen…

day36_JQuery

今日内容 零、 复习昨日 一、正则表达式 二、JQuery 零、 复习昨日 零、正则表达式 Regular expression RegExp 0.1 正则表达式 正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换&#xff0c;是对字符串执行模式匹配的强大工具。语法&#xff1a; va…

京东云技术团队 —— 浅谈测试用例设计

一、测试用例为什么存在 1.1 定义 测试用例(Test Case)是指对特定的软件产品进行测试任务的描述&#xff0c;体现测试方案、方法、技术和策略。测试用例内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等&#xff0c;最终形成文档类的输出。简而言之&am…

04. 数据结构之栈

前言 栈&#xff08;stack&#xff09;是一种线性数据的逻辑存储结构。栈中的元素只能先入后出&#xff08;First In Last Out&#xff0c;简称FILO&#xff09;。最早进入的元素存放的位置叫作栈底&#xff08;bottom&#xff09;&#xff0c;最后进入的元素存放的位置叫作栈…

网络故障老搞不定,就看这篇笔记

大家好&#xff0c;我是老杨。 做咱们这行&#xff0c;每天遇到的故障千奇百怪什么都有。很多网工每天只是在工作而已&#xff0c;遇到一个问题&#xff0c;就解决一个问题&#xff0c;每天的日子都是一样的&#xff0c;枯燥无趣。 但是&#xff0c;就很少有人去汇总问题&…

分布式事务的21种武器 - 1

在分布式系统中&#xff0c;事务的处理分布在不同组件、服务中&#xff0c;因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式&#xff0c;并分析其实现原理和优缺点&#xff0c;在面对具体分布式事务问题时&#xff0c;可以选择合适的模式…

Scala学习(五)---面向对象

文章目录 1.Scala面向对象的构造器1.1 主构造器和从构造器(辅助构造器)1.2 主构造器参数 2.继承2.1 抽象属性和方法2.2 匿名子类 1.Scala面向对象的构造器 1.1 主构造器和从构造器(辅助构造器) //主构造器 class ConstructorTest(name:String) {//主构造器调用val name1:Stri…

【MyBatis框架】

文章目录 Mybatis1.简介1.1MyBatis历史1.2MyBatis特性1.3MyBatis下载1.4和其它持久化层技术对比 2.搭建MyBatis2.1创建maven工程2.2创建MyBatis的核心配置文件2.3创建mapper接口2.4创建实体类2.5创建MyBatis的映射文件2.6通过junit测试功能2.7加入log4j日志功能2.8MyBatis的增删…

pytorch的学习与总结(第二次组会)

pytorch的学习与总结 一、pytorch的基础学习1.1 dataset与dataloader1.2 可视化工具(tensorboard)、数据转换工具(transforms)1.3 卷积、池化、线性层、激活函数1.4 损失函数、反向传播、优化器1.5 模型的保存、加载、修改 二、 pytorch分类项目实现2.1 网络模型2.2 具体代码 一…

新星计划2023【《计算之魂》读书会】学习方向报名入口!

前排提醒&#xff1a;这里是新星计划2023【《计算之魂》读书会】学习方向的报名入口&#xff0c;一经报名&#xff0c;不可更换。 ↓↓↓报名方式&#xff1a;&#xff08;下滑到本页面底部&#xff09; 一、关于本学习方向导师 博客昵称&#xff1a;异步社区博客主页&#x…

AI大模型时代,云从科技携“从容大模型”入场如何“从容”?

5月18日&#xff0c;在“AI赋能数字中国产业论坛暨2023云从科技人机协同发布会”上&#xff0c;云从科技自研“从容大模型”正式亮相。 根据发布会信息&#xff0c;“从容大模型”具备问答、阅读理解、文学创作以及解题方面的能力。受发布会消息影响&#xff0c;5月18日午间休盘…

【libdatachannel】cmake+vs2022 构建

libdatachannel libdatachannel 是基于c++17实现的构建 OpenSSL 找不到 Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22621. The CXX compiler identification is MSVC 19.35.32217.1 Detecting CXX compiler ABI info Detecting CXX compiler ABI inf…

利用GPIO线进行板间通信-23-5-22

本项目基于VU9P(xcvu9pflga2105)板卡以及ZYNQ(xc7z015clg485) 简单结构流程介绍&#xff1a; 1.上位机通过千兆网将指令下发到ZYNQ&#xff0c;ZYNQ进行解帧&#xff0c;将数据解析出来后存储到RAM中,RAM将数据不断输送给GPIO模块&#xff0c;GPIO模块根据对应地址输出数据是…

新来的00后实习生太牛了,已经被取代了.....

前几天有个朋友向我哭诉&#xff0c;说她在公司工作&#xff08;软件测试&#xff09;了7年了&#xff0c;却被一个00后实习生代替了&#xff0c;该何去何从&#xff1f; 这是一个值得深思的问题&#xff0c;作为职场人员&#xff0c;我们确实该思考&#xff0c;我们的工作会被…

1718_Linux命令模式下查看日历

全部学习汇总&#xff1a; GreyZhang/bash_basic: my learning note about bash shell. (github.com) 前面发布了一份学习笔记&#xff0c;涉嫌过渡宣传&#xff0c;虽然我也没搞懂为什么。有一系列修改建议&#xff0c;我觉得直接放弃了。还是发一份新的吧&#xff01; Linux命…

【数据结构】哈希底层结构

目录 一、哈希概念 二、哈希实现 1、闭散列 1.1、线性探测 1.2、二次探测 2、开散列 2.1、开散列的概念 2.2、开散列的结构 2.3、开散列的查找 2.4、开散列的插入 2.5、开散列的删除 3、性能分析 一、哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位…

如何用Postman做接口自动化测试?

本文适合已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。 工作环境与版本&#xff1a; Window 7&#xff08;64位&#xff09;Postman &#xff08;Chrome App v5.5.3&#xff09; P.S. 不同版本页面 U…

JAVA—实验4 继承、接口与多态

一、实验目的 掌握类的继承机制掌握接口的定义方法熟悉成员方法或构造方法多态性 二、实验内容 1&#xff0e;卖车&#xff0d;接口与多态编程 【问题描述】 (1) 汽车接口(Car)&#xff1a;有两个方法&#xff0c; getName()、getPrice()(接口源文件可以自己写&#xff0c;也…

2024总统大选,成为“关乎比特币未来的公投”?背后是怎样的政治抱负?

在今年的迈阿密比特币大会上&#xff0c;Robert F.Kennedy Jr和Vivek Ramaswamy相继发布声明表示&#xff0c;他们将在2024年初选前接受比特币&#xff08;BTC&#xff09;的捐款。 RFK Jr作为美国前总统约翰肯尼迪的侄子&#xff0c;是第一个公开接受Crypto的总统候选人&#…

chatgpt赋能Python-pythons_9_98_987

用Python计算s998987的方法及重要性分析 介绍 Python是一种开源的高级编程语言&#xff0c;它被广泛应用于数据处理、web开发和人工智能等领域。它的简洁、易读易写的语法使得很多程序员喜爱使用它来完成各种工作。本文将介绍如何用Python计算一个简单的数学表达式&#xff1…