贪心算法讲解

news2024/11/24 6:42:05

在这里插入图片描述

文章目录

  • 1. 贪心算法的概念
  • 2. 讲解贪心

1. 贪心算法的概念

贪心算法是:用一种局部最功利的标准,总是做出当前看来是最好的选择。如果局部最优解可以得出全局最优解,说明贪心假设成立,否则就失败

举个例子:
在这里插入图片描述
这里有一个矩形,里面放着0和1,我们想从左上角走到右下角,然后从右下角走到左上角,怎么走能取到最多的1。规定:左上->右下(只能往右边和下边走),右下->左上(只能往左边和上边走),走过的1都会变成0
在这里插入图片描述
如果我们的贪心思想是:左上->右下局部最多1,右下->左上局部最多1。先左上->右下:
在这里插入图片描述
这里我们取到了最多的1,但是右下->左上走的时候,取左边的1就取不到右边的1,取右边的1就取不到左边的1。

那么我们可以这样去走:
在这里插入图片描述
这样才能得出最多的1,所以前面的贪心思想是错误的。

2. 讲解贪心

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

首先,大家可能想到的方法是:如果前一个字符串比后一个字符串大,前面的就放在后面,后面的就放在前面

举个例子:
在这里插入图片描述
首先可以看到:cks比abc大,所有我们就把abc放前面,cks放后面,就形成了abccks。abccks比ft小,abccks就放在前面,ft就放在后面。就是abccksft。那么这样的一个方法它行不行呢?我们可以找个反例:
在这里插入图片描述
b比ba小,那么b就放在前面,ba放在后面。结果就是bba,但是这个字符串不是最小的,bab比bba小。所有这个策略不正确。

正确的策略是:ab<ba,a就放前,否则b就放前
为什么这个策略是对的,我们就需要去证明:ab<=ba,bc<=cb,那么ac<=ca。如果能证明出这个不等式就说明这个策略是对的,但是证明太复杂了,这里就不证明了

代码实现:
在这里插入图片描述

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

举个例子:
在这里插入图片描述
有这么一组数据,如果说,我们按照开始时间最小的来选,那么先选择[1,10],但是如果选择了这个后面三个都不能选了,选择[2,3],[3,5],[6,7]这样选择的场次最多,所以这个贪心思想是错误的。

那么什么方法的贪心思想是正确的呢
答案是:选择结束时间最早的

在这里插入图片描述
假设有这么一组数据,我们先按照结束时间来排序:
在这里插入图片描述
我们从0时刻开始,那么第一个结束时间最早的是[1,2],选择了这个之后,[1,4]就不能选择了,后面的都能选,结束时间最短的是[2,9],选择这个[3,10]就不能选了,只能选[9,12],所以最多结果就是3个。

代码实现:
在这里插入图片描述
创建一个类,代表会议的开始时间和结束时间。
在这里插入图片描述
这是比较方法,按照会议结束早的往前排。
在这里插入图片描述
排完序之后,按照当前时间和会议的开始时间比较,如果小于等于会议的开始时间就说明可以进行宣讲。

题目3:
在这里插入图片描述

解决思路是:
1.创建一个小根堆

在这里插入图片描述
这是一组数组,先从小到大排序,然后去构建它的小根堆:
在这里插入图片描述
我们每一次弹出两个数,然后把它们两加起来:
在这里插入图片描述
加起来之后,放入小根堆里:
在这里插入图片描述
再弹出两个数,然后加起来,放入小根堆里面:
在这里插入图片描述
再弹出两个数,然后加起来,放入小根堆里面:
在这里插入图片描述
重复上面的操作,当小根堆里只有一个数时停止:
在这里插入图片描述
我们把所有画圈的数加到一起就是最小值。

代码实现:
在这里插入图片描述

题目4:
在这里插入图片描述
举个例子:
在这里插入图片描述
这里初始资金是2,所以p2,p3都能做,但是p3的利润高,先选择p3。
在这里插入图片描述
现在的资金是7,所以p1,p2,p4都能做,p4的利润最高,先选择p4。
在这里插入图片描述
现在选出了2个,已经达到了k值,就不能再选择了,所以最大钱数是11。

解题思路:创建一个小根堆和一个大根堆,小根堆里按花费来排,大根堆里按利润来排。
在这里插入图片描述
初始资金是2,前面两个符合要求,我们就把前面两个弹出,放到大根组。
在这里插入图片描述
我们把大根堆的堆顶元素的利润弹出加到M上。然后弹出。
在这里插入图片描述
此时小根堆里面的元素都满足,弹出加到大根堆里。
在这里插入图片描述
再把大根堆的堆顶的利润加到M上,然后弹出。已经完成2个了,达到k值。

但是这里还存在一些问题,就是说我们的资金不能去做项目,并且大根堆里面也没有项目时,就直接返回

代码实现:
在这里插入图片描述
项目的定义,有花费和利润两个成员函数。
在这里插入图片描述
这是两个比较方法,优先级队列的比较有点奇怪,如果要创建小根堆,父亲要比孩子大才会交换,创建小根堆,父亲要比孩子小才会交换。
在这里插入图片描述

题目5:
在这里插入图片描述
举个例子:
在这里插入图片描述
这里的x是墙:一定不能放灯,但是可以点亮,也可以不点亮。
这里点是居民:可以放灯,也可以不放灯,但是一定要点亮。

那么根据上面的条件,最优的放灯是这样的:
在这里插入图片描述

解题思路:一共有4种情况。

1.如果i位置是墙,直接i+1
2.如果i位置是灯,i+1位置是墙,在i位置上放灯,然后直接去i+2位置上
3.如果i位置是灯,i+1位置是灯,i+2位置是墙,在i位置上放灯,然后直接去i+3位置上
4.如果i位置是灯,i+1位置是灯,i+2位置是灯,在i位置上放灯,然后直接去i+3位置上

代码实现:
在这里插入图片描述

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

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

相关文章

尚融宝26-投标

目录 一、需求 &#xff08;一&#xff09;投资人投标 &#xff08;二&#xff09;流程 二、标的详情 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;后端 &#xff08;三&#xff09;前端 三、计算收益 &#xff08;一&#xff09;四种还款方式 &#…

基于 A* 搜索算法来优化无线传感器节点网络的平均电池寿命(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 A*&#xff08;念做&#xff1a;A Star&#xff09;算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度。本文…

一篇带你快速入门DDD领域驱动设计

一、什么是领域驱动 领域驱动设计 Domain-Driven Design&#xff0c;简称DDD。软件对于行业并没有这么高的要求&#xff0c;他本身就是帮助其他行业更好的发展&#xff0c;赋能其他行业的。各个行业都有软件的身影&#xff0c;但是他们的业务场景是不同的&#xff0c;所以就需…

【MYSQL】数据类型和约束

目录 数据类型 1.数值类型 1.1.位--类型bit(M) 1.2. 整数类型--tinyint&#xff0c;smallint&#xff0c;int&#xff0c;bigint 1.3.小数类型--float、decimal 2.字符类型--char、varchar 3.日期类型--datetime、timestamp 4.string类型--enum和set mysql的约束 1.空…

Mybatis 知识总结2(基于注解的增删改查操作)

3.3 MyBatis 增删改查&#xff08;注解方式&#xff09; MyBatis 的增删改查是最基础最核心的功能&#xff0c;需要重点掌握。 需求说明 对员工信息进行增删改查操作。 查询&#xff08;查询结果分页展示后续实现&#xff09; 根据主键ID查询根据条件查询 新增更新删除 根据主…

海思芯片(hi3536av100)启动模式选择

1、支持多种模式可配置 (1)支持BootRom启动 (2)支持从 SPI NOR Flash 启动 (3)支持从 SPI NAND Flash 启动 (4)支持从 eMMC 启动 (5)支持 PCIe 从片启动 2、启动方式的选择 BOOT_SEL[1:0]SFC_EMMC_BOOT_MODEMODE000SPI Nor Flash 3 Byte001SPI Nor Flash 4 Byte010SPI Nand Fl…

2005-2020全国及各省家庭承包耕地流转总面积及经营耕地面积

2005-2020全国及各省家庭承包耕地流转总面积及经营耕地面积 1、时间&#xff1a;时间&#xff1a;2005-2020年 2、范围&#xff1a;包括全国及30个省份不包括西藏 3、指标包括&#xff1a;家庭承包耕地流转总面积(亩)、家庭承包经营耕地面积(亩) 4、来源&#xff1a;农村经…

荔枝派Zero(全志V3S) tftp下载 kernel 和 nfs 挂载文件系统

文章目录 前言一、U-Boot 适配 Ethernet1、配置 U-Boot2、修改 dts 文件3、编译4、烧写到 SD 卡5、测试<1>、查看启动打印信息<2>、ping 测试 二、Kernel 适配 Ethernet1、配置 kernel2、修改 dts 文件3、编译4、拷贝到 SD 卡5、测试<1>、启动网络接口&#…

【嵌入式环境下linux内核及驱动学习笔记-(7-内核 I/O)-多路复用】

目录 2、多路复用2.1 函数select相关2.1.1 应用层select()2.1.2 FD_ZERO2.1.3 FD_SET2.1.4 FD_ISSET 2.2 函数poll相关2.2.1 poll函数 2.3 驱动层 函数2.4 实例 接上篇&#xff0c;继续内核 I/O的五种模式的解读。 2、多路复用 select&#xff0c;poll&#xff0c;epoll都是IO…

常见的接口优化技巧思路

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 二、接口优化方案总结 1.批处理 批量思想&#xff1a;批量操作数据…

windows如何确认服务器上程序端口是否正常

方式1&#xff1a;ping命令 ping命令说明 ping命令是个使用频率极高的网络诊断工具&#xff0c;在Windows、Unix和Linux系统下均适用。它是TCP/IP协议的一部分&#xff0c;用于确定本地主机是否能与另一台主机交换数据报。根据返回的信息&#xff0c;我们可以推断TCP/IP参数设…

类和对象 -上(C++)

目录 认识面向过程和面向对象 类的引入 类的定义 语法&#xff1a; 类的两种定义方式&#xff1a; 成员变量命名规则建议 类的访问限定符及封装 访问限定符 C 中 class 和 struct 的区别&#xff1f; 封装 类的作用域 类的实例化 类对象模型 如何计算类对象的大小 结构体的内存…

想保护你的网站?用Python来生成验证码图片

前言 随着互联网的发展&#xff0c;我们越来越多地依赖于网站和应用程序&#xff0c;而这些网站和应用程序也面临着各种各样的安全威胁&#xff0c;其中之一就是用户可能会通过脚本攻击你的网站。为了缓解这些安全风险&#xff0c;一个常见的做法是在用户进行操作时&#xff0…

关于电信设备进网许可制度若干改革举措的通告

Q&#xff1a;3月1日后&#xff0c;不再实行进网许可管理的11种电信设备是否还需要继续申请和使用标志&#xff1f; A&#xff1a;3月1日起&#xff0c;对不再实行进网许可管理的11种电信设备停止核发进网许可标志&#xff0c;已申请的标志可在证书有效期内继续使用。 Q&#…

应用启动时aerospike客户端查询rt高原因

在应用刚起步时&#xff0c;发到预发测试或者生产小部分流量进来时&#xff0c;发现aerospike的rt特别高&#xff0c;在流量稍微大点时&#xff0c;rt恢复正常。基本可以断定客户端存在预热问题。 应用没有设置连接池配置&#xff0c;因此check下默认配置 可以看到&#xff0…

c++类 笔记(陆续更新该文档)

派生类 #include <iostream> using namespace std; class Box{private://类私有&#xff0c;只有成员可以调用 也就是说你不可以通过box1.a来调用 ,这些变量其实你默认不用写private 这个变量&#xff0c;只要放在最上面他默认就是 私有int a1;protected://protected&am…

AlgoC++:课程总结

目录 课程总结前言1. 未讲解内容2. 复习2.1 矩阵求导2.2 优化方法2.3 具体的算法 3. 未来怎么学C(必看&#xff01;&#xff01;&#xff01;) 课程总结 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课…

【嵌入式环境下linux内核及驱动学习笔记-(8-内核 I/O)-信号驱动】

目录 3 信号驱动的异步通知3.1 linux异步通知编程3.1.1 什么是信号3.1.2 信号的工作流程: 3.2. 应用层3.2.1 信号接收 signal函数3.2.2 应用层 fcntl 函数3.2.3 应用层信号驱动机制步骤 3.3 驱动层3.3.1 驱动层模板3.3.2 驱动层 实现fasync函数3.3.3 fasync_helper3.3.4 struct…

Golang-常见数据结构Slice

Slice slice 翻译成中文就是切片&#xff0c;它和数组&#xff08;array&#xff09;很类似&#xff0c;可以用下标的方式进行访问&#xff0c;如果越界&#xff0c;就会产生 panic。但是它比数组更灵活&#xff0c;可以自动地进行扩容。 了解 slice 的本质, 最简单的方法就是…

MySQL 一条SQL语句是如何执行的?

总览 ​ 所以今天我们把MySQL拆解一下&#xff0c;看看里边有哪些零件。下边是MySQL的基本架构示意图。 大体来说&#xff0c;MySQL分为Server层和存储引擎两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&am…