贪心算法入门

简介

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。也就是首先选取局部最优,从局部最优推出全局最优。

举例

有一堆不同面额的钞票,要从中取十次,要求最后的总金额最大。我们当然是每次都去取最大面额的钞票,最终的总金额才是最大。

特点

贪心算法的题目有两种极端:第一种是比较简单的,这一种在解答时候会觉得就是常识,怎么还需要算法呢。第二种就是复杂类的。在此说明的原因是希望各位不要轻视贪心算法,这个算法没有那么简单。

题目示例

示例一:分发饼干

假设数组stomach=[1,2,7,10]表示的是孩子胃口的大小,数组cookie=[1,3,5,9]表示饼干大小,用这些饼干最多可以满足多少孩子(饼干的大小要大于小孩胃口才能满足孩子)。最终结果输出3.

要想满足上述条件,局部最优也应该是如下

 public static int getResult(int[] stomach,int[] cookie){//TODO 在最开始先将两个数组排序,此处示例是已经排好序的,故省略//最终返回结果int result = 0;//该变量是饼干数组的最大索引int index = cookie.length-1;//在遍历匹配时应倒叙取遍历,因为最先匹配胃口最大的小孩(局部最优)for (int i = stomach.length-1; i >= 0; i--) {//获取到饼干数组的最后一个索引对应的数据,将该数据和stomacth数组的每一个数据比较//注意:必须先比较索引不能为负数,如果调整while循环的位置,会出现异常情况while (index>=0 && cookie[index]>=stomach[i]){//记录此次结果result++;//饼干数组的索引往前移动一位index--;break;}}return result;}public static void main(String[] args) {int[] stomach={1,2,7,10};int[] cookie={1,3,5,9};int result = getResult(stomach, cookie);System.out.println(result);}

示例二:摆动序列

给定数组arr,可以删除数组中的元素,问什么时候摆动序列最长。(摆动序列:相邻两个数的差值满足一正一负或一负一正)。

举例一:[1,7,4,9,2,5] ,后一个数字减去前一个数字的正负为:+  - +  - +,所以原数组是摆动序列,输出6.

举例二:[1,17,5,10,13,15,10,5,16,8]。 输出结果:7

根据上图可知,要想满足摆动序列去删除元素,首先峰值的三个不能删除,只能删除在增长过程中的数据(局部最优)

在编码时要考虑相同的情况

  1. 上下有p情况,如:[1,2,2,2,1]
  2. 首尾元素:如果数组中只有两个元素,且不相同,认为是两个摆动
  3. 单调过程中有平破,如:[1,2,2,3,4]
​public static int getResult(int[] arr){if (arr.length==1)return 1;//前序差值int preDiff = 0;//后序差值int curDiff = 0;//默认最右端是有一个坡度的int result = 1;for (int i = 0; i < arr.length - 1; i++) {curDiff = arr[i+1] - arr[i];if ((preDiff>=0 && curDiff <0) || (preDiff<=0 && curDiff > 0)){//因为最终是要返回摆动序列的长度,没有必要真正的去删除原数组中的数值result++;//当前数值比较完成后数据往后移动,下一个的preDiff就是上一次的curDiff//不能将这行代码放到if外面,preDiff只有在坡度发生变化的时候才去更改,而不是每次都去更改,//为了解决上方的第三点:单调平破preDiff = curDiff;}}return result;}public static void main(String[] args) {
//        int[] arr = {1,2,2,3,4};int[] arr = {1,17,5,10,13,15,10,5,16,8};int result = getResult(arr);System.out.println(result);}​

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

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

相关文章

【python开发】安装配置启动+数据库管理+表管理+数据行管理+python操作Mysql及相关安全的问题

Mysql入门 一、安装&启动1、安装2、测试3、设置和修改root密码 二、数据库管理1、内置客户端操作&#xff08;1&#xff09;查看当前所有的数据库(show databases);&#xff08;2&#xff09;创建数据库&#xff1a;create database learn&#xff08;数据库名&#xff09;…

北京中科富海低温科技有限公司确认出席2024第三届中国氢能国际峰会

会议背景 随着全球对清洁能源的迫切需求&#xff0c;氢能能源转型、工业应用、交通运输等方面具有广阔前景&#xff0c;氢能也成为应对气候变化的重要解决方案。根据德勤的报告显示&#xff0c;到2050年&#xff0c;绿色氢能将有1.4万亿美元市场。氢能产业的各环节的关键技术突…

四川宏博蓬达法律咨询有限公司:法律服务安全的新标杆

在这个法治社会&#xff0c;法律服务行业扮演着越来越重要的角色。四川宏博蓬达法律咨询有限公司&#xff0c;作为行业内的佼佼者&#xff0c;始终坚持以客户为中心&#xff0c;为客户提供专业、高效、安全的法律服务。 一、公司背景与实力展示 四川宏博蓬达法律咨询有限公司自…

C语言例3-26:逗号表达式的例子

逗号表达式&#xff1a; 表达式1&#xff0c;表达式2 表达式可以是算术表达式、关系表达式、逻辑表达式、条件表达式、赋值表达式和逗号表达式。 代码如下&#xff1a; #include<stdio.h> int main(void) {int i1,j;float f2.0f;char chb; //b(98)// printf(&…

罗格朗逸景PLUS IOT智能系统发布,为您提供更智能的生活体验!

罗格朗全新推出的逸景PLUS IOT智能系统现已正式上市,采用纤薄纯平的设计,功能丰富全面,支持灯光/温度/场景控制、背景音乐等多种功能,整合罗格朗IOT2.0系统,集成可视对讲,为用户打造更舒适、安全的智能生活。 罗格朗智能家居 罗格朗是全球电气与智能建筑系统专家,创立于1865年…

【3D reconstruction 学习笔记 第二部】

三维重建 3D reconstruction 4. 三维重建与极几何三角化&#xff08;线性解法&#xff09;三角化&#xff08;非线性解法&#xff09;多视图几何极几何极几何约束基础矩阵估计 5. 双目立体视觉重建6. 多视图重建7. SFM 系统设计8. SLAM系统设计 4. 三维重建与极几何 三角化&…

Orbit 使用指南 08 | 登记注册环境 | Isaac Sim | Omniverse

如是我闻&#xff1a; 在上一个指南中&#xff0c;我们学习了如何创建一个自定义的车杆环境。我们通过导入环境类及其配置类来手动创建了一个环境实例 # create environment configurationenv_cfg CartpoleEnvCfg()env_cfg.scene.num_envs args_cli.num_envs# setup RL envir…

在 Linux/Ubuntu/Debian 上安装 SQL Server 2019

Microsoft 为 Linux 发行版&#xff08;包括 Ubuntu&#xff09;提供 SQL Server。 以下是有关如何执行此操作的基本指南&#xff1a; 注册 Microsoft Ubuntu 存储库并添加公共存储库 GPG 密钥&#xff1a; sudo wget -qO- https://packages.microsoft.com/keys/microsoft.as…

jeect-boot queryFieldBySql接口RCE漏洞(CVE-2023-4450)复现

jeect-boot积木报表由于未授权的 API /jmreport/queryFieldBySql 使用了 freemarker 解析 SQL 语句从而导致了 RCE 漏洞的产生。 1.漏洞级别 高危 2.漏洞搜索 fofa app"Jeecg-Boot 企业级快速开发平台"3.影响范围 JimuReport < 1.6.14.漏洞复现 这个漏洞的…

C/C++代码性能优化——编程实践

1. 编程实践 在一些关键的地方&#xff0c;相应的编程技巧能够给性能带来重大提升。 1.1. 参数传递 传递非基本类型时&#xff0c;使用引用或指针&#xff0c;这样可以避免传递过程中发生拷贝。参数根据是否需要返回&#xff0c;相应加上const修饰&#xff0c;代码更安全&am…

Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证

昨日&#xff0c;Redis 官方宣布了一项重要变更&#xff1a;他们将修改开源协议&#xff0c;未来所有版本将采用 “源代码可用” 的许可证。 具体来说&#xff0c;Redis 不再使用 BSD 3-Clause 开源协议进行分发。从 Redis 7.4 版本开始&#xff0c;Redis 将采用 SSPLv1 和 RSA…

初学php反序列化

php中&#xff0c;序列化和反序列化是相对的两个过程&#xff0c;序列化是把变量或对象转化成字符串的过程 反序列化是把字符串转换为变量过着对象的过程 在php的反序列化中&#xff0c;存在类&#xff0c;当类被以特定的方式就会触发魔术方法&#xff0c;在实行序列化的过程…

CSS的使用与方法

什么是CSS CSS是层叠样式表。它是一种用于描述网页或者文档外观和样式的标记语言。 层级样式表&#xff1a;就是给HTML标签加样式的。 如果说HTML是个游戏英雄 、那么CSS就是游戏皮肤。 【一】注释语法 /* 注释 */ 【二】CSS的语法结构 选择符 {样式属性: 样式属性值;样…

深度学习新篇章:PyTorch在遥感地物分类的革命性应用

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

数据结构从入门到精通——排序的概念及运用

排序的概念及运用 前言一、排序的概念排序稳定性内部排序外部排序 二、排序运用三、常见的排序算法四、排序性能检测代码srand()clock() 五、oj排序测试代码 前言 排序是将数据按照一定规则重新排列的过程&#xff0c;常见规则有升序、降序等。排序算法如冒泡排序、快速排序等…

如何关闭Wifi的双频合一功能?很简单

前言 前段时间中国电信建议关闭路由器的双频合一功能&#xff0c;主要是为了解决Wi-Fi速度慢、信号弱等问题。 双频合一是啥&#xff1f;简单来说就是同个Wi-Fi信号有两种不同的通道……嗯&#xff0c;可能有点看不懂。。。 简单来说就是A地点到B地点有两条路&#xff0c;一条…

基于ssm的勤工助学管理系统+数据库+报告+免费远程调试

项目介绍: 基于ssm的勤工助学管理系统。Javaee项目&#xff0c;ssm项目。采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybatisplus VuelayuiMaven来实现。有管理员和老…

第十五届蓝桥杯嵌入式模拟考试I

第十五届蓝桥杯嵌入式模拟考试I 时隔多日&#xff0c;蓝桥杯比赛将之&#xff0c;听老师说还有模拟题这个东西(以前从没听说过)&#xff0c;不模拟不知道&#xff0c;一模拟吓一跳&#xff0c;废话不多说直接上图&#xff0c;这是只做编程题的得分满分85,剩下的几分我实在拿不…

Python:熟悉简单的skfuzzy构建接近生活事件的模糊控制器”(附带详细注释说明)+ 测试结果

参考资料&#xff1a;https: // blog.csdn.net / shelgi / article / details / 126908418 ————通过下面这个例子&#xff0c;终于能理解一点模糊理论的应用了&#xff0c;感谢原作。 熟悉简单的skfuzzy构建接近生活事件的模糊控制器 假设下面这样的场景, 我们希望构建一套…

互联网思维:息共享、开放性、创新和快速反应、网络化、平台化、数据驱动和用户体验 人工智能思维:模拟人、解放劳动力、人工智能解决方案和服务

互联网思维&#xff1a;信息共享、开放性、创新和快速反应、网络化、平台化、数据驱动和用户体验 互联网思维是指一种以互联网为基础的思考方式&#xff0c;强调信息共享、开放性、创新和快速反应的特点。这种思维方式注重网络化、平台化、数据驱动和用户体验&#xff0c;以适…