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

news2024/11/23 8:36:25

给你一个整数数组 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.coloradmin.cn/o/874127.html

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

相关文章

Creo结构设计-创建ASM装配工程以及零件协调配合绘图

问题描述 在结构设计时&#xff0c;往往包含了多个组件&#xff0c;各个组件需要分开设计&#xff0c;但同时需要借鉴上一个模块的尺寸信息&#xff0c;如果创建多个零件&#xff0c;最后再组合那么会降低效率&#xff0c;那么有什么好的解决方式&#xff0c;能够再一个工程里…

代码随想录算法训练营之JAVA|第二十七天| 455. 分发饼干

今天是第27天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 455. 分发饼干https://leetcode.cn/problems/assign-cookies/ 第一想法 题目理解&#xff1a;G个人分 S块饼干 要求饼干大于或者等于人的肚量。 第一想法&#xff1a;将人按照肚量从小到达…

PyQt5的信号与槽函数

目录 一、介绍 二、一个信号连接一个槽 三、一个信号连接多个槽 四、多个信号连接一个槽 五、自定义信号 1、创建自定义信号 2、让自定义信号携带值 一、介绍 在下图中 &#xff08;1&#xff09;widget就是PyQt中的控件对象。其实就是组件&#xff08;2&#xff09;…

教育行业文件协作的最佳实践分享!

在教育工作中&#xff0c;经常需要进行文件协作&#xff0c;无论是师生间还是老师与老师之间。目前最常用的文件协作方式就是通过社交工具或者邮件进行文件共享。 这种协作方式的缺点 1、大文件传输不便&#xff1a;这种协作方式依托于社交工具&#xff0c;对于大文件传输并不…

YOLOV8/YOLOv7/YOLOv5改进:引入GAMAttention注意力机制

为了提高各种计算机视觉任务的性能&#xff0c;人们研究了各种注意机制。然而&#xff0c;以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此&#xff0c;我们提出了一种全局调度机制&#xff0c;通过减少信息缩减和放大全局交互表示来提高深度神经网络…

6914. 翻倍以链表形式表示的数字

题目描述&#xff1a; 给你一个 非空 链表的头节点 head &#xff0c;表示一个不含前导零的非负数整数。 将链表 翻倍 后&#xff0c;返回头节点 head 。 示例&#xff1a; 解题思路&#xff1a; 先计算第一位是否超出位数&#xff0c;超出新建存储该数值&#xff0c;再逐个翻倍…

JZ34二叉树中和为某一值的路径

题目地址&#xff1a;二叉树中和为某一值的路径(二)_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 这里求的是和为某一值的路径&#xff0c;要用dfs算法&#xff0c;也就是说这里使用深度优先搜索算法。 从根节点开始向左右子树进行递归操作&#xff0c;在递…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK设置相机固定帧…

ORCA优化器浅析——CDXLScalarFilter Class for DXL filter operators

CDXLScalarFilter CDXLScalarFilter为Class for representing DXL filter operators。CDXLScalarFilter相对于CDXLScalar没有增加其他数据成员。 class CDXLScalarFilter : public CDXLScalar{ private: CDXLScalarFilter(CDXLScalarFilter &); // private copy ctor pub…

初识C语言(3)

什么是C语言 1.第一个C语言程序 2.数据类型 3.变量、常量 4.字符串转义字符注释 5.选择语句 6.循环语句 7.函数 8.数组 9.操作符 10.常见关键字 11.define 定义常量和宏 12.指针 13.结构体 这一篇文章我们从常见关键字开始说起&#xff0c;也是…

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)

1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

2023年国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

Spring 使用注解开发、代理模式、AOP

使用注解开发 在Spring4之后&#xff0c;要使用注解开发&#xff0c;必须要保证AOP的包导入了 项目搭建&#xff1a; 在配置文件中导入约束&#xff0c;增加注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…

LangChain手记 Memory

整理并翻译自DeepLearning.AILangChain的官方课程&#xff1a;Memory Memory 使用open ai的API调用GPT都是单次调用&#xff0c;所以模型并不记得之前的对话&#xff0c;多轮对话的实现其实是将前面轮次的对话过程保留&#xff0c;在下次对话时作为输入的message数组的一部分&…

6.1 安全漏洞与网络攻击

数据参考&#xff1a;CISP官方 目录 安全漏洞及产生原因信息收集与分析网络攻击实施后门设置与痕迹清除 一、安全漏洞及产生原因 什么是安全漏洞 安全漏洞也称脆弱性&#xff0c;是计算机系统存在的缺陷 漏洞的形式 安全漏洞以不同形式存在漏洞数量逐年递增 漏洞产生的…

python编程小游戏简单的,python小游戏编程100例

大家好&#xff0c;给大家分享一下python编程小游戏简单的&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 不会python就不能用python开发入门级的小游戏&#xff1f; 当然不是&#xff0c;我收集了十个python入门小游戏的源码和教程&#…

基于Yolov5与LabelImg训练自己数据的完整流程

基于Yolov5与LabelImg训练自己数据的完整流程 1. 创建虚拟环境2. 通过git 安装 ultralytics3. 下载yolov54. 安装labelImg标注软件5. 使用labelImg进行标注&#xff0c;图片使用上面的coco1285.1 点击“打开目录”选择存储图像的文件夹进行标注&#xff0c;右下角会出现图像列表…

用 React+ts 实现无缝滚动的走马灯

一、走马灯的作用 走马灯是一种常见的网页交互组件&#xff0c;可以展示多张图片或者内容&#xff0c;通过自动播放或者手动切换的方式&#xff0c;让用户能够方便地浏览多张图片或者内容。 本次实现的不是轮播图而是像传送带一样的无限滚动的形式。 二、需求梳理 走马灯可设…

MySQL中的锁机制

抛砖引玉&#xff1a;多个查询需要在同一时刻进行数据的修改&#xff0c;就会产生并发控制的问题。我们需要如何避免写个问题从而保证我们的数据库数据不会被破坏。 锁的概念 读锁是共享的互相不阻塞的。多个事务在听一时刻可以同时读取同一资源&#xff0c;而相互不干扰。 写…

mysql 习题总结

1.select sex,avg(salsry) as 平均薪资 from emp group by sex; 2.select depart,sum(salsry) from emp group by depart; 3.select depart ,sum(salary) from emp group by depart order by sum(salary) desc limit 1,1; 4.select name from emp group by name having count(n…