力扣53-最大子序和(Java详细题解)

news2024/11/15 7:10:48

题目链接:力扣53-最大子序和

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

本题的题目描述很清晰,就是想让我们找到本数组的具有最大和的连续子数组。

直接用我们的dp五部曲来系统分析一下。

1.确定dp数组和i下标的含义。

dp[i] 指的就是以i为结尾的最大连续子数组和。

注意这里是以i为结尾,所以i必须是该最大连续子数组的最后一个元素,所以本题收集结果的地方可能是任意位置。

即所有以下标i的元素结尾的最大连续数组和都可能是我们的结果。

2.确定递推公式。

既然我们考虑下标为i的元素是连续子数组和的一部分,那我们就要遍历数组中的每一个元素。

因为我们是要找最大和的连续子数组。

所以遍历到i时,有俩种情况。

  • 第一种 选择该元素作为子数组和的最后一个元素

    如果是第一种的话,那么选择了该元素,我们肯定就要把这个元素加入到我们的连续子数组中,加到哪个连续子数组中呢?

    就是加到dp[i - 1]中,就是以i前一个元素为结尾的连续子数组中。

    所以代码就为:dp[i] = dp[i - 1] + nums[i];

  • 第二种 另起炉灶,以该元素作为连续子数组的起点,把前面的连续数组的和都不要。

    所以代码就为 dp[i] = nums[i];

    因为我们要取最大值,所以要对俩种情况取一个最大值。

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

3.dp初始化。

本题可以从递推公式可以看出dp[i]的状态依靠于dp[i - 1],所以所有状态的起点就是dp[0]。

dp[0]指的就是以下标0为结尾的最大连续子数组和。

dp[0]只有一个下标为0的元素,所以他的连续子数组和就为nums[0];

所以初始化dp[0] = nums[0];

4.确定dp的遍历顺序。

由递推公式也可以看出dp[i]的状态依靠于dp[i - 1],所以一定是从前往后遍历的。

5.如果没有ac打印dp数组 利于debug。

在这里插入图片描述

在前面说到 最大结果的地方可以是任何地方,所以我们怎么收集结果呢?

遍历一遍求最大值即可。

最终代码:

class Solution {
    public int maxSubArray(int[] nums) {
         //dp数组的定义
        if(nums.length == 1)return nums[0];
        int [] dp = new int [nums.length + 1];
         //因为dp数组的定义是以下标i结尾的最大子数组和,所以结果可能在任何地方。
         //所以还需要我们遍历一遍dp数组来求出最大的结果 这里使用了一个代码技巧 直接在循环里面 边更新边比较
         //这里的i是从1开始
         //为了比较所有的dp数组 所以我们的result就初始化为nums[0] 这样就能
        dp[0] = nums[0];
         int result = dp[0];
        //为什么这里是从1开始,因为下标0我们已经初始化了
         for(int i = 1;i < nums.length;i ++){
            dp[i] = Math.max(dp[i - 1] + nums[i],nums[i]);
             //边推出dp数组边比较收集结果
            result = Math.max(dp[i],result);
         }
         return result;
    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

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

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

相关文章

EM-seq:酶法甲基化测序,甲基化测序的新选择

DNA甲基化作为一种关键的表观遗传修饰&#xff0c;已被广泛认为在基因表达调控、细胞分化以及多种疾病的发生发展中扮演着重要角色。DNA甲基化&#xff1a;将甲基基团添加到DNA分子的胞嘧啶上&#xff0c;可以影响基因的活性而不改变DNA序列&#xff0c;这种改变的持久性和可逆…

【原创教程】电气电工20:一文弄透电气电工辅材

电气电工这些知识点,我们描述的比较细,虽然看起来比较简单,但是它是后面我们技能提升的基础,如果我们后面学电气工程师相关知识,这些都属于基本功。 接着我们来看一下电气辅材。 电气辅材定义: 电气辅材是指与电气设备固有的元器件配套使用的配件和器具。常见的电气辅…

基于FPGA+GPU异构平台的遥感图像切片解决方案

随着遥感和成像技术的不断进步和普及&#xff0c;获取大量高分辨率的遥感图像已成为可能。这些大规模的遥感图像数据需要进行有效的处理和分析&#xff0c;以提取有用的信息&#xff0c;进行进一步的应用。遥感图像切片技术应运而生&#xff0c;该技术可以将大型遥感图像分割成…

Sentinel组件学习

Sentinel组件学习 1. Sentinel是什么2. Sentinel的作用3. 为啥使用Sentinel4. SpringCloud整合Sentinel代码示例4.1. 搭建Sentinel Dashboard4.2. SpringCloud项目接入Sentinel4.3. 使用SentinelResource注解 5. Sentinel Dashboard使用5.1 流控规则流控模式流控效果 5.2 熔断规…

cmake--get_filename_component

作用 按照指定的方式获取文件或者目录的信息。 使用 get_filename_component(<variable> <filename> <component>) variable: 用于保存提取的信息。 filename: 指定路径的文件或者目录。 component: 链接1 component DIRECTORY: 提取文件或者目录的父…

西安国际数字影像产业园:什么让这里成为创新型数字园区的典范?

在数字化浪潮奔涌的时代&#xff0c;创新型数字园区如雨后春笋般涌现&#xff0c;而树莓集团倾力打造的西安国际数字影像产业园无疑是其中的佼佼者。究竟是什么让这里成为创新型数字产业园区的典范呢&#xff1f; 1、西安国际数字影像产业园拥有强大的产业集聚效应。树莓集团凭…

『功能项目』QFrameWork道具栏物品生成【64】

我们打开上一篇63QFrameWork框架重构OnGUI的项目&#xff0c; OnGUI优点&#xff1a; 简单易用&#xff1a;OnGUI是基于代码的UI系统&#xff0c;对于简单的调试界面或者小型项目来说&#xff0c;可以快速实现UI需求。即时更新&#xff1a;OnGUI的UI元素是即时更新的&#xff…

基于Benes网络的SIMD同态密文任意重排

摘要 RLWE的密文使用了SIMD后极大的增加的同态加密的效率。同态加密通过加密一个向量&#xff0c;实现对明文的快速加法和乘法。然而&#xff0c;加密为一个密文的向量的内部元素之间&#xff0c;无法高效的操作。 如一个密文加密了 [ a , b , c ] [a,b,c] [a,b,c]&#xff0c…

13 vue3之内置组件keep-alive

内置组件keep-alive 有时候我们不希望组件被重新渲染影响使用体验&#xff1b;或者处于性能考虑&#xff0c;避免多次重复渲染降低性能。而是希望组件可以缓存下来,维持当前的状态。这时候就需要用到keep-alive组件。 开启keep-alive 生命周期的变化 初次进入时&#xff1a;…

使用express或koa或nginx部署history路由模式的单页面应用

使用hash模式会有#&#xff0c;影响美观&#xff0c;所以使用history模式会是个更好的选择。 前端项目打包上线部署&#xff0c;可以使用下面的方式部署history模式的项目&#xff0c;下面以 jyH5 为例 expressjs部署 express脚手架搭建的app.js中添加如下代码&#xff1a; …

大模型团队招人(校招):阿里巴巴智能信息,2025届春招来了!

阿里巴巴智能信息&#xff0c;2025届春招开始啦&#xff0c;欢迎有意向的优秀同学扫码投递。实习的内容也是大语言模型的核心方向Alignment&#xff0c;在这里有丰富的实验资源、良好的数据支持、优秀的师兄师姐带领你进入大模型的全新领域。内推直达&#xff1a;https://talen…

【Python】探索 Blinker:Python 进程内信号/事件分发系统

没人疼就去健身 &#xff0c;练完浑身疼&#xff01; 在现代软件开发中&#xff0c;事件驱动编程是一种非常强大的模式&#xff0c;它允许系统组件之间进行松散耦合的通信。Blinker 是一个 Python 库&#xff0c;提供了一个快速的进程内信号/事件分发系统&#xff0c;使得事件…

Double-Fetch漏洞检测工具的部署、使用与原理分析

文章目录 前言1、概述1.1、简介1.2、工作原理1.2.1、内核空间与用户空间的信息传递1.2.2、Double-Fetch漏洞产生的原因1.2.3、产生Double-Fetch漏洞的情况1.2.4、一个Double-Fetch漏洞示例1.2.5、Double-Fetch漏洞检测工具原理 1.3、模式匹配原理分析1.3.1、Coccinelle介绍1.3.…

AN7563PT数据手册学习笔记1

AN7563PT AN7563PT1 Overview2 Feature3 Block Diagram AN7563PT 1 Overview AN7563PT是一款高度集成的单芯片解决方案&#xff0c;适用于以太网网关应用。集成4个千兆以太网物理层、1个DDR4/DDR3控制器、1个USB3.0主机接口、1个USB2.0主机接口、2个PCIe Gen2单通道、1个VoIP…

什么是损失函数?常见的损失函数有哪些?

损失函数 什么是损失函数&#xff1f;损失函数作用如何设计损失函数常见的损失函数有哪些&#xff1f; 什么是损失函数&#xff1f; 损失函数&#xff08;Loss Function&#xff09;&#xff0c;也称为误差函数&#xff0c;是机器学习和深度学习中的一个重要概念。它用于衡量模…

光伏设计软件的基本功能

一、屋顶绘制 光伏设计软件的首要功能是屋顶绘制。通过直观易用的界面&#xff0c;可以轻松绘制出建筑物的屋顶轮廓、结构细节等基本信息。软件支持多种屋顶类型的绘制&#xff0c;并允许用户自定义屋顶尺寸和形状。 二、参照物、障碍物放置 在光伏系统设计中&#xff0c;参照…

2024考研数学真题解析-数二:

第一类间断点&#xff1a;可去间断点&#xff0c;跳跃间断点。 幂指函数x的取值范围是x>0。 接着分母不能为0推出x1&#xff0c;x2是间断点&#xff0c;由幂指函数x>0可知&#xff0c;x0也是间断点。 先求x0处的极限&#xff0c;这里没有必要求0左右两边的极限&#xff0…

如何下载旧版本app或者旧版本的电脑软件?下载旧版本手机app和电脑软件的方法

下载旧版本软件的方法介绍&#xff0c;下面以下载旧版本剪映为例&#xff1a;

Java标识符、关键字和保留字

Java中的标识符、关键字和保留字 标识符概念标识符命名规则&#xff08;必须遵守&#xff09;标识符命名规范&#xff08;更加专业&#xff09;关键字保留字 标识符概念 1.Java对各种变量、方法和类等命名时使用的字符序列称为标识符。 2.凡是自己可以起名字的地方都叫标识符 …

鸿蒙生态应用

鸿蒙生态应用开发核心概念 HarmonyOS 应用&#xff1a;使用 HarmonyOS SDK 开发的应用程序&#xff0c;能够在华为终端设备 &#xff08;如&#xff1a;手机、平板等&#xff09;上运行&#xff0c;其有两种形态&#xff1a; ⚫ 传统方式的需要安装的 App。 ⚫ 轻量级&#xf…