面试热题(最大子数组和)

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

子数组 是数组中的一个连续部分。

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

最大子数组和,我们今天从递推——记忆化搜索——动态规划来解决本题

  • 递推

假如当前数为1,如果前面的sum和是小于0的是不是有:

       数组[-2,1]的子数组和一定比[1]的子数组和小,所以我们就可以推得递推:假如你当前元素前面的子数组和是小于零的,加上当前的值的和一定比当前元素本身的值要小,所以我们取最大的,只取本身这个元素,所以我们就可以推得关系式:

Math.max(nums[i],前面子数组最大和+nums[i]);

函数签名:

  public int dfs(int i,int[] nums){}

       函数dfs返回的是当包含索引为i的元素时,子数组的最大和通过for循环,将0~n-1索引的最大子数组和通过比较,找出最大值,就是我们所要的结果

 int ans=nums[0];for(int i=1;i<nums.length;i++){ans=Math.max(ans,dfs(i,nums));}

 递归很明显

 

       因为中间做了很多重复的操作,使得超时,那么我们怎么样才能避免这样重复的操作发生呢?

这个时候我们的记忆化搜索就派上了用场

  • 记忆化搜索

       记忆化搜索无非就是维护一个数组,将计算后的结果存进数组中,等到计算时,先去数组中找,看是否被计算过,如果计算过,直接在数组中找,如果没有计算,计算之后将结果存进数组中,以便后续的使用

int[] memo;memo=new int[nums.length];Arrays.fill(memo,-1);
 if(memo[i]!=-1){return memo[i];}memo[i]=Math.max(nums[i],dfs(i-1,nums)+nums[i]);

 源码如下:

    int[] memo;public int maxSubArray(int[] nums) {if(nums==null||nums.length==0){return 0;}memo=new int[nums.length];Arrays.fill(memo,-1);int ans=nums[0];for(int i=1;i<nums.length;i++){ans=Math.max(ans,dfs(i,nums));}return ans;}public int dfs(int i,int[] nums){if(i<0){return 0;}if(memo[i]!=-1){return memo[i];}memo[i]=Math.max(nums[i],dfs(i-1,nums)+nums[i]);return memo[i];}
  • 动态规划

        递归是自顶向下,那么动态规划就是自底向上,通过基础(base)推,这里有个非常高大上的名字就做状态转移方程,其实

Math.max(nums[i],dfs(i-1,nums)+nums[i]);

其实递推关系式和我们的状态转移方程在某种意义上来讲是一样的

int[] dp=new int[nums.length];

base(当dp[0]时,只有索引为0的元素,自然而然最大值就是nums[0])

dp[0]=nums[0];

进行状态转移:

for(int i=1;i<nums.length;i++){dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);}

源码如下:

 //动态规划public int maxSubArray(int[] nums) {if(nums==null||nums.length==0){return 0;}int[] dp=new int[nums.length];dp[0]=nums[0];for(int i=1;i<nums.length;i++){dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);}int ans=Integer.MIN_VALUE;for(int i=0;i<dp.length;i++){ans=Math.max(dp[i],ans);         }return ans;}

       在这里给大家安利一种比较简便的方法,不用你会动态规划、不用你会记忆化搜素、不用你会递归    所谓的正反馈法

假如现在的一个

       假如当前你准备要往子数组[-2,1,-3]中加入元素4,但是原本这个子数组的值是小于0,如果你是这个4,本身自身已经很大了,在这个弱肉强食的时代,你还要带几个拖油瓶去拉低你自己的值,即使没有神一样的队友,也解决不要猪一样的队友,所以不如自己单干,正向反馈类似于这个思想

源代码如下:

public int maxSubArray(int[] nums) {if(nums==null||nums.length==0){return 0;}//正反馈int sum=0;int ans=nums[0];for(int num:nums){//如果之前的和大于0,说明之前的操作对于结果是正反馈if(sum>0){sum+=num;//之前的和小于0,说明之前的操作对于当前结果是负反馈}else{sum=num;}//去中间最大值ans=Math.max(sum,ans);}return ans;}

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

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

相关文章

SolidUI 一句话生成任何图形,v0.2.0功能介绍

文章目录 背景聊天窗口提示词 聊天窗口生成输入数据格式柱形图曲面图散点图螺旋线饼图兔子建模地图 设计页面页面布局预览 SolidUI社区的未来规划如何成为贡献者加群 背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容…

【数据结构】哈希表

总结自代码随想录 哈希表的原理&#xff1a; 对象通过HashCode()函数会返回一个int值&#xff1b;将int值与HashTable的长度取余&#xff0c;该余数就是该对象在哈希表中的下标。

GCviewer分析java垃圾回收的情况

一&#xff0c;下载并打包 1.在github上下载gcviewer,并解压。 2. 运行maven命令打包。mvn clean package -DskipTests 二&#xff0c;启动GCViewer 进入target目录&#xff0c;运行 java -jar gcviewer-1.37-SNAPSHOT.jar 运行后&#xff0c;会出来界面 三&#xff0c;加参…

docker菜谱大全

记录docker常用软件安装&#xff0c;感谢小马哥和杨师傅的投稿。&#x1f60e;&#x1f60e;&#x1f60e; 相关文档&#xff1a; DockerHub&#xff1a;https://hub.docker.com/Linux手册&#xff1a;https://linuxcool.com/Docker文档&#xff1a;https://docs.docker.com/Do…

【设计模式】原型模式

原型模式&#xff08;Prototype Pattern&#xff09;是用于创建重复的对象&#xff0c;同时又能保证性能。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式之一。 这种模式是实现了一个原型接口&#xff0c;该接口用于创建当前对象的克隆。当直接…

MySQL 45讲笔记(1-10讲)

1. SQL语句如何开始执行&#xff1f; MySQL分为Server和存储引擎两部分&#xff1a; Server层包含连接器、存储缓存、分析器、执行器等&#xff0c;以及所有的内置函数&#xff08;事件、日期&#xff09;等等&#xff0c;还有视图、触发器。 存储引擎是负责数据的存储和提取&a…

Java多款线程池,总有一款适合你。

线程池的选择 一&#xff1a;故事背景二&#xff1a;线程池原理2.1 ThreadPoolExecutor的构造方法的七个参数2.1.1 必须参数2.1.2 可选参数 2.2 ThreadPoolExecutor的策略2.3 线程池主要任务处理流程2.4 ThreadPoolExecutor 如何做到线程复用 三&#xff1a;四种常见线程池3.1 …

POI处理excel,根据XLOOKUP发现部分公式格式不支持问题

poi4不支持XLOOKUP函数&#xff0c;但poi最新的5.2.3却已经对此函数做了支持 poi下载地址&#xff1a;Index of /dist/poi/release/bin 公式源码位置&#xff1a;org/apache/poi/ss/formula/atp/XLookupFunction.java 但是在使用此函数过程中&#xff0c;发现有些XLOOKUP函数会…

网络设备(防火墙、路由器、交换机)日志分析监控

外围网络设备&#xff08;如防火墙、路由器、交换机等&#xff09;是关键组件&#xff0c;因为它们控制进出公司网络的流量。因此&#xff0c;监视这些设备的活动有助于 IT 管理员解决操作问题&#xff0c;并保护网络免受攻击者的攻击。通过收集和分析这些设备的日志来监控这些…

Oracle database Linux自建环境备份至远端服务器自定义保留天数

环境准备 linux下安装oracle 请看 oracle12c单节点部署 系统版本: CentOS 7 软件版本&#xff1a; Oracle12c 备份策略与实现方法 此次备份依赖Oracle自带命令exp与linux下crontab命令&#xff08;定时任务&#xff09; exp Oracle中exp命令是一个用于导出数据库数据和对象的…

虚拟机内搭建CTFd平台搭建及CTF题库部署,局域网内机器可以访问

一、虚拟机环境搭建 1、安装docker、git、docker-compose ubuntu&#xff1a; sudo apt-get update #更新系统 sudo apt-get -y install docker.io #安装docker sudo apt-get -y install git #安装git sudo apt-get -y install python3-pip #安装pip3 sudo pip install dock…

JavaEE初阶:多线程 - 编程

1.认识线程 我们在之前认识了什么是多进程&#xff0c;今天我们来了解线程。 一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行 着多份代码. 引入进程这个概念&#xff0c;主要是为了解决并发编程这样的…

时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测

时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测 目录 时序预测 | MATLAB实现CNN-BiGRU-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU-Attention时间序列预测&#xff0c;CNN-BiGRU-Attention结合注意力机制时…

机器学习笔记之优化算法(十二)梯度下降法:凸函数VS强凸函数

机器学习笔记之优化算法——梯度下降法&#xff1a;凸函数VS强凸函数 引言凸函数&#xff1a;凸函数的定义与判定条件凸函数的一阶条件凸函数的梯度单调性凸函数的二阶条件 强凸函数强凸函数的定义强凸函数的判定条件强凸函数的一阶条件强凸函数的梯度单调性强突函数的二阶条件…

【从零学习python 】21.Python中的元组与字典

文章目录 元组一、访问元组二、修改元组三、count, index四、定义只有一个数据的元组五、交换两个变量的值 字典介绍一、列表的缺点二、字典的使用进阶案例 元组 Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。元组使用小括号&#xff0c;列表使用方括号…

C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)

queue和priority_queue&#xff08;理解使用和模拟实现&#xff09; 什么是queuequeue的使用1.queue构造函数2.empty()3.size()4.front()5.back();6.push7.emplace8.pop()9.swap queue模拟实现什么是priority_queuepriority_queue的使用1.priority_queue构造函数1.1 模板参数 C…

论文阅读 RRNet: A Hybrid Detector for Object Detection in Drone-captured Images

文章目录 RRNet: A Hybrid Detector for Object Detection in Drone-captured ImagesAbstract1. Introduction2. Related work3. AdaResampling4. Re-Regression Net4.1. Coarse detector4.2. Re-Regression 5. Experiments5.1. Data augmentation5.2. Network details5.3. Tra…

DP(区间DP)

目录 石子合并 合并果子&#xff08;贪心 Huffman树&#xff09; 环形石子合并 石子合并 设有 N 堆石子排成一排&#xff0c;其编号为 1,2,3,…,N。 每堆石子有一定的质量&#xff0c;可以用一个整数来描述&#xff0c;现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻…

全文检索与日志管理 Elasticsearch(上)

一、Elasticsearch介绍 1.1 全文检索索引 Elasticsearch是一个全文检索服务器&#xff0c;全文检索是一种非结构化数据的搜索方式。 那么什么是结构化数据和非结构化数据呢&#xff1f; 结构化数据&#xff1a;指具有固定格式固定长度的数据&#xff0c;如数据库中的字段。 …

如何有效开展网络安全事件调查工作

网络安全事件调查是现代企业网络安全体系建设的关键组成部分。为了防止网络攻击&#xff0c;仅仅关注于安全工具的应用效果远远不够&#xff0c;因为安全事件一直都在发生。安全团队只有充分了解攻击者的行踪和攻击路径&#xff0c;才能更好地防范更多攻击时间的发生。 做好网…