贪心算法入门

简介

贪心算法(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);
    }

​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

axios前端参数的传递几种方法

直接拼接url const axios require(axios);// 假设有两个参数&#xff1a;id 和 category const id 123;// 使用模板字符串将参数拼接在 URL 上 axios.get(https://api.xxx.com/data?id${id}).then(response > {console.log(response.data);}).catch(error > {console.…

Altair Compose® 数学运算、编程、数据分析及可视化

Altair Compose 数学运算、编程、数据分析及可视化 分析数据、开发算法或创建模型 - Altair Compose 旨在将你的想法付诸实施。 Altair Compose 是一个用于数学计算、数据操作和可视化、编程和调试脚本的环境&#xff0c;对重复运算和流程自动化非常有用。Altair Compose 让用…

短视频矩阵系统----源头开发

短视频矩阵源码技术开发要求及实现流程&#xff1a; 短视频矩阵开发要求具备视频录制、编辑、剪辑、分享等基本功能&#xff0c;支持实时滤镜、特效、音乐等个性化编辑&#xff0c;能够实现高效的视频渲染和处理。开发流程主要包括需求分析、技术选型、设计架构、编码实现、测试…

2024-3-22-Qtday3作业

1> 思维导图 2> 要求&#xff1a; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否…

【GO全栈掌握入门】

GO语言全栈学习咯 ~ 1. GO 语言简介2.语言特性3.哪些公司使用GO语言&#xff1f;3. 安装GO开发环境4. 学习说明&#xff1a;5. GO结构篇5.1 工作空间5.2 导入包5.3 组织结构5.4 依赖管理 6. GO骨肉篇7.GO工具篇 1. GO 语言简介 起源于2007年&#xff0c;GO语言之年轻如你所见&…

深度学习:复杂工业场景下的复杂缺陷检测方法

摘要&#xff1a;在复杂的工业场景中&#xff0c;缺陷检测一直是一个重要而具有挑战性的任务。近年来&#xff0c;深度学习技术的快速发展为复杂工业场景下的缺陷检测提供了新的解决方案。本文将介绍深度学习在复杂工业场景下的复杂缺陷检测中的应用&#xff0c;并探讨其技术进…

基于NetCoreServer的WebSocket客户端实现群播(学习笔记)

一、NetCoreServer介绍 超快速、低延迟的异步套接字服务器和客户端 C# .NET Core 库&#xff0c;支持 TCP、SSL、UDP、HTTP、HTTPS、WebSocket 协议和 10K 连接问题解决方案。 开源地址&#xff1a;https://github.com/chronoxor/NetCoreServer 支持&#xff1a; Example: TC…

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

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

隐语笔记3 —— 隐语架构

隐语架构一览 隐语产品层 定位&#xff1a; 通过可视化产品&#xff0c;降低终端用户的体验和演示成本。通过模块化API降低技术集成商的研发成本。 人群画像&#xff1a; 隐私保护计算集成商&#xff0c;产品人员&#xff0c;隐私保护计算需求方&#xff0c;开发人员&#xff…

2024年全球生成人工智能全景图【中文】

2024年全球生成人工智能全景图【中文】 在过去的一年中&#xff0c;产生式人工智能&#xff08;GenAI&#xff09;无疑成为了全球各行各业的热门话题。特别是ChatGPT的发布&#xff0c;激发了公众对GenAI强烈的兴趣和激动&#xff0c;唤醒了我们对其变革潜力的认知。 虽然我们…

Redis中的缓存雪崩

缓存雪崩 &#x1f914;现象分析 缓存雪崩是指在同一时段大量的缓存key同时失效或者缓存服务(Redis等)宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 &#x1f44a; 解决方案 利用Redis集群提高服务的可用性&#xff0c;避免缓存服务宕机给缓存业务添…

软件架构和基于架构的软件开发方法知识总结

一、软件架构定义 软件架构为软件系统提供了一个结构、行为和属性的高级抽象 软件架构是一种表达&#xff0c;使软件工程师能够&#xff1a; &#xff08;1&#xff09;分析设计在满足所规定的需求方面的有效性 &#xff08;2&#xff09;在设计变更相对容易的阶段&#xff0c;…

当我想用ChatGPT-Next-Web来套壳Azure OpenAI Service时

使用Cloudflare worker来代理Azure OpenAI API&#xff0c; 并将其转换为兼容OpenAI的API 一直没能搞定OpenAI的订阅&#xff0c; 就因为没有搞定国外的信用卡&#xff0c; 所以就一直使用GPT-3.5来处理日常的文字生成工作&#xff0c; 例如写文档&#xff0c; 生成一些简单的脚…

python网络相册设计与实现flask-django-nodejs-php

此系统设计主要采用的是python语言来进行开发&#xff0c;采用django框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一定的安…

前端学习笔记 | AJAX

一、axios 是什么&#xff1a;AJAX是异步的JavaScript和XML。它可以在不重新刷新页面的情况下与服务器通信&#xff0c;交换数据&#xff0c;或更新页面。 概念&#xff1a;AJAX是浏览器与服务器进行数据通信的技术。 1、使用axios库与服务器进行数据通信 &#xff08;1&#x…

skywalking监听apisix

一、原理 Skywalking结合OpenTelemetry Collector Apisix的promethus插件实现对apisix metrics数据的收集。 二、数据流图 1. Apisix Promethus插件从Apisix收集指标数据。 2. OpenTelemetry Collector通过promethus receiver获取来自Apisix Promethus插件的指标数据&#…

Codeforces Round 498 (Div. 3)

目录 A. Adjacent Replacements B. Polycarps Practice C. Three Parts of the Array D. Two Strings Swaps E. Military Problem F. Xor-Paths A. Adjacent Replacements 简单思维题 每一个数都变成第一个小于等于自己的的奇数 void solve(){cin>>n;while(n--){…

现在阿里云云服务器租用多少钱?一张表,报价单

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

c++核心学习5

4.6继承 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。这个时候我们就可以考虑利用继承的技术&#xff0c;减少重复代码 4.6.1继承的基本语法…

Nature:“量子龙卷风”首次模拟黑洞

科学家们在超流体氦气中首次创造出了一个巨大的“量子漩涡”&#xff08;quantum vortex&#xff09;&#xff0c;用以模拟黑洞。这一成就不仅使他们能够更加细致地观察模拟黑洞的行为&#xff0c;还能探究其与周围环境的交互作用。 诺丁汉大学的研究团队与伦敦国王学院和纽卡斯…