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

给你一个整数数组 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.mzph.cn/news/40572.shtml

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

相关文章

免费批量ppt转pdf?一个方法教你完美转换

随着科技的不断发展&#xff0c;电子文档的使用越来越普遍。在商业、教育和个人领域&#xff0c;我们经常需要将PPT文件转换为PDF格式&#xff0c;以便更方便地共享和存档。幸运的是&#xff0c;现在有许多在线工具和软件可以帮助我们轻松地完成免费批量ppt转pdf。下面将介绍一…

【Linux】模拟实现linux的shell

#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> #define NUM 1024 #define SIZE 32 #define SEP " " int main() {//保存输入后的字符串char …

Blazor前后端框架Known-V1.2.12

V1.2.12 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…

Pyinstaller 打包 django 项目如何将命令行参数加入?

起因 Pyinstaller 打包 django 项目&#xff0c;打包成 manage.exe 后用命令行 cmd manage.exe runserver 0.0.0.0:8001 --noreload 来运行感觉很不方便。 希望能够直接把命令行参数也打包进去&#xff0c;直接运行 exe 。我走了些弯路&#xff0c;但最终实现了。 弯路 我看…

Redis之删除策略

文章目录 前言一、过期数据二、数据删除策略2.1定时删除2.2惰性删除2.3 定期删除2.4 删除策略比对 三、逐出算法3.1影响数据逐出的相关配置 总结 前言 Redis的常用删除策略 一、过期数据 Redis是一种内存级数据库&#xff0c;所有数据均存放在内存中&#xff0c;内存中的数据可…

web基础入门和PHP语言基础入门 一

web基础入门和php语言基础入门 一 WEB简介与HTTP入门WEB简介HTTP 简介HTTP 请求报文&#xff1a;请求方法&#xff1a;请求头部&#xff1a;&#xff08;常见的请求头&#xff09;HTTP 响应报文&#xff1a;响应状态码&#xff1a;Cookie HTML入门学习什么是HTML什么是标记语言…

PHP入门基础教程 - 专栏导读

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责…

Floyd算法

正如我们所知道的&#xff0c;Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展&#xff0c;三个for循环就可以解决问题&#xff0c;所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下&#xff1a;从任意节点A到任意节点B的最短路径不外乎2种可能&#xff…

openGauss学习笔记-42 openGauss 高级数据管理-触发器

文章目录 openGauss学习笔记-42 openGauss 高级数据管理-触发器42.1 语法格式42.2 参数说明42.3 示例 openGauss学习笔记-42 openGauss 高级数据管理-触发器 触发器会在指定的数据库事件发生时自动执行函数。 42.1 语法格式 创建触发器 CREATE TRIGGER trigger_name { BEFORE…

Swagger-ui在idea中的使用

1.添加依赖 <!--添加swagger2相关概念--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!--添加swagger-ui相关功能--><de…

Linux学习之基本指令一

在学习Linux下的基本指令之前首先大家要知道Linux下一切皆目录&#xff0c;我们的操作基本上也都是对目录的操作&#xff0c;这里我们可以联想我们是如何在windows上是如何操作的&#xff0c;只是形式上不同&#xff0c;类比学习更容易理解。 目录 01.ls指令 02. pwd命令 0…

PS实现多个图片转化GIF动画

PS实现多个图片转化为GIF动画步骤 一、导入图片素材1.打开PS软件&#xff0c;点击 [文件] --- [脚本] ---[将文件载入堆栈]2.选择图片3.导入成功 二、打开时间轴1.点击[窗口]---[时间轴]2.选择创建帧动画3.创建帧动画 三、创建动画1.复制帧。2.设置帧的内容。3.修改图片停留的时…

分布式应用:Zabbix监控Tomcat

目录 一、理论 1.Zabbix监控Tomcat 二、实验 1.Zabbix监控Tomcat 三、问题 1.获取软件包失败 2.tomcat 配置 JMX remote monitor不生效 3.Zabbix客户端日志报错 一、理论 1.Zabbix监控Tomcat &#xff08;1&#xff09;环境 zabbix服务端&#xff1a;192.168.204.214 …

推荐 4 个 yyds 的 GitHub 项目

本期推荐开源项目目录&#xff1a; 1. 开源的 Markdown 编辑器 2. MetaGPT 3. SuperAGI 4. 一个舒适的笔记平台 01 开源的 Markdown 编辑器 Cherry 是腾讯开源的 Markdown 编辑器&#xff0c;基于 Javascript具有轻量简洁、易于扩展等特点&#xff0c; 它可以运行在浏览器或服…

UVM学习知识点

这里是引用 include 和 import pkg区别 1.作用 include与C语言中类似&#xff0c;用于在一个文件中插入另一个文件&#xff1b;import用于在一个作用域中引入一个package&#xff08;或其中的内容&#xff09;&#xff0c;使得这些内容在当前作用域中可以不添加其所在的packag…

Tesseract用OpenCV进行文本检测

我没有混日子&#xff0c;只是辛苦的时候没人看到罢了 一、什么是Tesseract Tesseract是一个开源的OCR&#xff08;Optical Character Recognition&#xff09;引擎&#xff0c;OCR是一种技术&#xff0c;它可以识别和解析图像中的文本内容&#xff0c;使计算机能够理解并处理…

Maven之mirrorof范围

mirrorOf 是 central 还是 * 的问题 在配置阿里对官方中央仓库的镜像服务器时&#xff0c;我们使用到了 <mirror> 元素。 <mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>阿里云公共仓库</name><url>…

vmalert集成钉钉告警

vmalert通过在alert.rules中配置告警规则实现告警&#xff0c;告警规则语法与Prometheus兼容&#xff0c;依赖Alertmanager与prometheus-webhook-dingtalk实现钉钉告警&#xff0c;以下步骤&#xff1a; 1、构建vmalert 从源代码构建vmalert&#xff1a; git clone https://…

企业权限管理(十)-用户详情

用户详情 UserController findById方法 Controller RequestMapping("/user") public class UserController {Autowiredprivate IUserService userService;//查询指定id的用户RequestMapping("/findById.do")public ModelAndView findById(String id) thro…

糖尿病视网膜病变,黄斑病变,年龄相关检测研究(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…