贪心法思想-求最大子数组和案例图解

贪心法思想

​ 基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期获得全局最优解。

​ 正如其名字一样,贪心法在解决问题的策略上目光短浅,只根据当前已有的信息做出选择。一旦做出选择,不管将来有什么结果,这个选择都不会改变。

与动态规划对比:

​ 贪心算法和动态规划都常用于解决优化问题。它们之间存在一些相似之处,比如都依赖最优子结构性质,但工作原理不同。

  • 动态规划会根据之前阶段的所有决策来考虑当前决策,并使用过去子问题的解来构建当前子问题的解。
  • 贪心算法不会考虑过去的决策,而是一路向前地进行贪心选择,不断缩小问题范围,直至问题被解决。

举例-零钱兑换问题:

​ 贪心算法实现简单,易于理解,效率也很高,但是具有局限性。

有一组不同面额的硬币,给定一个总金额 𝑎𝑚𝑡 ,计算并返回可以凑成总金额所需的最少的硬币个数 。

每次贪心的选择尽可能大的硬币(不大于总金额的最大硬币),直至凑出目标金额为止。

硬币组合[100、50、10、5、1],总金额amt为131:

在这里插入图片描述

但是,某些情况下使用贪心是无法得到最优解的:

​ 硬币组合:[1,20,50],总金额 𝑎𝑚𝑡=60 ,贪心算法只能找到 50+1×10 的兑换组合,共计 11 枚硬币,但动态规划可以找到最优解 20+20+20 ,仅需 3 枚硬币。

分析:

​ 对于组合1、3、4,需要金额6,那么按照贪心法:4+1+1三个,而3+3两个即可。

​ 如果硬币组合间有倍数关系,那么较大的硬币可以使用多个较小的硬币组合,意味着能用较小硬币的任意数量组合(加起来大于较大硬币),都可以直接使用较大硬币+一定数量的较小硬币替代去减少数量,不会出现3+3等于6,而4和3无法组合出6的这种情况。

贪心法案例-求最大子数组和图解

问题描述:

​ 给一个整数数组 ,请找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

原始数组:

nums = [-2,1,-3,4,-1,2,1,-5,4]

蛮力法:

​ 直接遍历所有情况,将任意情况下的最优解记录下来,取最大的

 public static int solution(int[] data, int n) {if (n < 0 || (n == 1 && data[0] <= 0)) {return 0;}if (n == 1) {return data[0];}int maxSum = 0, thisSum;// 计算i到i,i到i+1,...,i到n的和,选出最大的一个子序列。  // 当i从0遍历到n-1时,则计算过了所有的子序列for (int i = 0; i < n; i++) {thisSum = 0;// i 表示子序列左侧的位置for (int j = i; j < n; j++) { // j 表示子序列右边的位置// 汇总 i到j 的所有数之和时,对比solution1发现// 其实每次求和不需要都从i位置开始,因为 i到k的和 = i到K-1的和 + data[k]thisSum += data[j];maxSum = Math.max(maxSum, thisSum);}}return maxSum;}
贪心法:

​ 如果当前的子序列和小于0,那么负数+任何数都会变小,所以应该舍弃掉当前已经选择的子序列。

​ 所以我们只需要考虑当前的最优解即可,不断向后遍历数组,直到遍历完数组就可以得到最大的子序列和。

1、初始化

在这里插入图片描述

2、下标0

​ 下标为0,此时当前最大值变为 0 + ( − 2 ) = − 2 0+(-2)=-2 0+(2)=2,然后结果取负无穷和-2之间较大的,即-2.

t h i s M a x S u b = 0 + ( − 2 ) = − 2 thisMaxSub = 0 + (-2) = -2 thisMaxSub=0+(2)=2

− 2 > 负无穷  推出   r e s u l t = − 2 -2>负无穷 ~~推出~~ result = -2 2>负无穷  推出  result=2

​ 因为-2为负数,一定会使后续的子序列和变小,直接舍弃。

− 2 < 0 推出   t h i s M a x S u b = 0 -2<0 ~~推出~~ thisMaxSub = 0 2<0  推出  thisMaxSub=0

在这里插入图片描述

3、下标1

​ 当前最大值变为 0 + 1 = 1 0+1=1 0+1=1,然后结果取-2和1之间较大的,即1.

t h i s M a x S u b = 0 + 1 = 1 thisMaxSub = 0 +1= 1 thisMaxSub=0+1=1

1 > − 2 推出   r e s u l t = 1 1>-2 ~~推出~~ result = 1 1>2  推出  result=1

在这里插入图片描述

3、下标2

​ 当前最大值变为 1 + ( − 3 ) = − 2 1+(-3)=-2 1+(3)=2,然后结果取1和-2之间较大的,即1.

t h i s M a x S u b = 1 + ( − 3 ) = − 2 thisMaxSub = 1 + (-3) = -2 thisMaxSub=1+(3)=2

1 > − 2 推出   r e s u l t = 1 1>-2 ~~推出~~ result = 1 1>2  推出  result=1

​ 因为-2为负数,一定会使后续的子序列和变小,直接舍弃。

− 2 < 0 推出   t h i s M a x S u b = 0 -2<0 ~~推出~~ thisMaxSub = 0 2<0  推出  thisMaxSub=0

在这里插入图片描述

4、下标3

​ 当前最大值变为 0 + 4 = 4 0+4=4 0+4=4,然后结果取1和4之间较大的,即4.

t h i s M a x S u b = 0 + 4 = 4 thisMaxSub = 0 + 4 = 4 thisMaxSub=0+4=4

4 > 1 推出   r e s u l t = 4 4>1 ~~推出~~ result = 4 4>1  推出  result=4

在这里插入图片描述

5、下标4

​ 当前最大值变为 4 + ( − 1 ) = 3 4+(-1)=3 4+1=3,然后结果取4和3之间较大的,即4.

t h i s M a x S u b = 4 + ( − 1 ) = 3 thisMaxSub = 4 + (-1) = 3 thisMaxSub=4+1=3

4 > 3 推出   r e s u l t = 4 4>3 ~~推出~~ result = 4 4>3  推出  result=4

在这里插入图片描述

6、下标5

​ 当前最大值变为 3 + 2 = 5 3+2=5 3+2=5,然后结果取4和5之间较大的,即5.

t h i s M a x S u b = 3 + 2 = 5 thisMaxSub = 3+2=5 thisMaxSub=3+2=5

5 > 4 推出   r e s u l t = 5 5>4 ~~推出~~ result = 5 5>4  推出  result=5

在这里插入图片描述

​ 最终得到最大值为6

    public static int execute(int[] data) {// result:存储最大值;thisMaxSub:存储当前最大值int result = Integer.MIN_VALUE, thisMaxSub = 0;for (int datum : data) {thisMaxSub += datum;result = Math.max(thisMaxSub, result);// tempMaxSub小于0的话,就可以直接舍弃掉,因为负数+任何数都会变得更小thisMaxSub = Math.max(thisMaxSub, 0);}return result;}

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

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

相关文章

AI绘画,5分钟用 stable diffusion 做装修图,室内设计师要失业了

大家好我是极客菌&#xff01;随着AI绘画功能越来越强大&#xff0c;不光可以用来画人物&#xff0c;为电商模特一键换衣&#xff0c;还可以在5分钟内生成一张室内效果图&#xff0c;看来室内设计师饭碗也岌岌可危了。 1、获得室内线稿图 首先&#xff0c;打开3ds max &#…

LabVIEW航空用电缆检测

系统通过集成LabVIEW平台&#xff0c;实现了航空用电缆检测过程中的自动数据收集、处理和报告生成&#xff0c;显著提升了检测效率和数据准确性&#xff0c;降低了人工干预&#xff0c;提高了电缆检测的可靠性。 项目背景 在航空领域&#xff0c;电缆的质量检测对确保飞机及其…

c语言中extern定义和引用其他文件的变量,(sublime text)单独一个文件编译不会成功

关键字extern的作用 这个很常见的都知道是定义一个外部变量或函数&#xff0c;但并不是简单的建立两个文件&#xff0c;然后在用extern 定义在另一个非最初定义变量的文件里 区分文件和编译运行的文件 例如&#xff0c;一个文件夹里有文件a.c和文件b.c,在sublime text中直接…

深入解析链表:解锁数据结构核心奥秘

一. 链表的定义 链表是一种线性数据结构&#xff0c;由一系列节点组成。每个节点包含两个部分&#xff1a; 数据域&#xff08;Data&#xff09;&#xff1a;存储节点的数据。指针域&#xff08;Pointer&#xff09;&#xff1a;存储指向下一个节点的地址。 链表的第一个节点…

【Linux】Wmware Esxi磁盘扩容

目录 一、概述 1.1 磁盘分区概念 1.2 LVM概念 二、扩容步骤 二、报错 一、概述 1.1 磁盘分区概念 在 Linux 中&#xff0c;每一个硬件设备都映射到一个系统的文件&#xff0c;对于硬盘、光驱等 IDE 或 SCSI 设备也不例外。Linux把各种 IDE 设备分配了一个由 hd 前缀组成的文…

论文辅导 | 基于贝叶斯优化-卷积神经网络-双向长短期记忆神经网络的锂电池健康状态评估

辅导文章 模型描述 准确估计电池健康状态是设备稳定运行的关键。针对当前健康状态研究中容量难以直接测量、估计模型调参费时等问题&#xff0c;提出基于多健康特征的贝叶斯优化&#xff08;BO&#xff09;算法优化卷积神经网络&#xff08;CNN&#xff09;与双向长短期记忆&a…

冯雷老师:618大退货事件分析

近日冯雷老师受邀为某头部电商36名高管进行培训&#xff0c;其中聊到了今年618退货潮的问题。以下内容整理自冯雷老师的部分授课内容。 一、引言 随着电子商务的蓬勃发展&#xff0c;每年的618大促已成为消费者和商家共同关注的焦点。然而&#xff0c;在销售额不断攀升的同时…

【详细教程】如何使用YOLOv10进行图片与视频的目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

datax入门(data-web的简单使用)——02

datax入门&#xff08;data-web的简单使用&#xff09;——02 1. 前言1.1 关于data-web官网1.1.1 源码下载1.1.2 datax-Web部署手册1.1.2.1 Linux环境部署手册1.1.2.2 本地开发环境部署手册 1.2 关于datax入门 2. 下载之后打包、启动、登录2.1 我的本地环境2.2 修改配置2.3 初始…

html纯原生网页引入vue3版本的quill editor

效果图 版本 vueup/vue-quill v1.2.0vue3.3.8Element Plus v2.4.2 引入流程 找一个vue3的项目, 然后安装插件vue版本的quill: vue-quill npm install vueup/vue-quill --save官方地址&#xff1a;https://vueup.github.io/vue-quill/ 安装完成之后&#xff0c;把vue-quil插件下…

解开孤独症谱系障碍:原因与症状的深度洞察

孤独症谱系障碍&#xff0c;这个日益受到关注的话题&#xff0c;让许多人感到困惑和担忧。那么&#xff0c;它究竟是由什么原因引起的&#xff0c;又有哪些表现症状呢&#xff1f; 引起孤独症谱系障碍的原因目前尚未完全明确&#xff0c;但研究表明&#xff0c;可能与以下因素有…

ROS2使用Python创建服务提供者、消费者

1.创建服务提供者 ros2 pkg create example_service_rclpy --build-type ament_python --dependencies rclpy example_interfaces --node-name service_server_02 service_server_02.py 代码 #!/usr/bin/env python3 import rclpy from rclpy.node import Node # 导入接口 …

量产工具一一显示系统(一)

目录 前言 一、项目介绍和应用 1.简单易用 2.软件可配置、易扩展 3.纯 C 语言编程 4.类似界面应用 二、项目总体框架 三、显示系统 1.显示系统数据结构抽象 &#xff08;1&#xff09;common.h &#xff08;2&#xff09;disp_manager.h 2.Framebuffer编程 &#x…

Unity数据持久化3——Json

概述 基础知识 Json文件格式 Json基本语法 练习 可以搜索&#xff1a;Json在线&#xff0c;复制代码进去解析是否写错了。 Excel转Json C#读取存储Json文件 JsonUtility using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine;[Sy…

AI周报(6.23-6.29)

AI应用-巴西医生成功用Vision Pro做手术 巴西外科医生布鲁诺戈巴托&#xff08;Bruno Gobbato&#xff09;在2024年4月22日首次成功使用Apple Vision Pro进行了肩袖撕裂的手术。这次手术采用了肩关节镜技术&#xff0c;通过关节内的摄像头捕捉图像&#xff0c;并通过高分辨率的…

基于Spring Boot的校园失物招领系统

1 项目介绍 1.1 研究的背景及意义 在网络时代飞速发展的今天&#xff0c;随着网络技术日臻完善&#xff0c;我们的生活方式正经历深刻变革。在物质追求日益增长的同时&#xff0c;提升个人精神境界也成为了现代人的共同向往&#xff0c;而阅读则是滋养心灵、丰富精神世界的重…

PyScript:在浏览器中释放Python的强大

PyScript&#xff1a;Python代码&#xff0c;直接在网页上运行。- 精选真开源&#xff0c;释放新价值。 概览 PyScript是一个创新的框架&#xff0c;它打破了传统编程环境的界限&#xff0c;允许开发者直接在浏览器中使用Python语言来创建丰富的网络应用。结合了HTML界面、Pyo…

WLAN 4-Way Handshake如何生成GTK?

关于Wi-Fi的加密认证过程&#xff0c;可以参考如下链接&#xff0c;今天我们来理解如何生成GTK。 WLAN数据加密机制_tls加密wifi-CSDN博客 1 GTK GTK&#xff08;Group Temporal Key&#xff09;是由AP通过GMK生成&#xff0c;长度为128位&#xff0c;并在四次握手的第三步中…

使用Netty框架实现WebSocket服务端与客户端通信(附ssl)

仓库地址&#xff1a; https://gitee.com/lfw1024/netty-websocket 导入后可直接运行 预览页面 自签证书&#xff1a; #换成自己的本地ip keytool -genkey -alias server -keyalg RSA -validity 3650 -keystore D:\mystore.jks -ext sanip:192.168.3.7,ip:127.0.0.1,dns:lo…

【STM32修改串口波特率】

STM32微控制器中的串口波特率调整通常涉及到USART&#xff08;通用同步接收器/发送器&#xff09;模块的配置。USART模块提供了多个寄存器来设置波特率&#xff0c;其中关键的寄存器包括BRR&#xff08;波特率寄存器&#xff09;和USART_CR1&#xff08;控制寄存器1&#xff09…