【每日一题】53. 最大子数组和-2023.11.20

题目:

53. 最大子数组和

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

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

示例 1:

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

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

解答:

一句话题解:

这是一道典型的使用「动态规划」解决的问题,需要我们掌握动态规划问题设计状态的技巧(无后效性),并且需要知道如何推导状态转移方程,最后再去优化空间。

方法一:动态规划

「力扣」第 53 题(最大子序和)是「力扣」第 124 题(二叉树的最大路径和)的线性版本,它们的状态设计思想和状态转移是类似的,希望大家能够通过本题题解进一步体会状态是如何想到的(即子问题的定义需要从哪些方面考虑)。

本题接的重点在「关键 1:理解题意」和「关键 2:如何定义子问题(如何定义状态)」和「最后再谈谈「无后效性」。

关键 1:理解题意

题目要我们找出和最大的连续子数组的值是多少,「连续」是关键字,连续很重要,不是子序列。

题目只要求返回结果,不要求得到最大的连续子数组是哪一个。这样的问题通常可以使用「动态规划」解决。

关键 2:如何定义子问题(如何定义状态)

设计状态思路:把不确定的因素确定下来,进而把子问题定义清楚,把子问题定义得简单。动态规划的思想通过解决了一个一个简单的问题,进而把简单的问题的解组成了复杂的问题的解。

友情提示:上面这句话大家姑且这么一看,脑子里有个印象,没有那么绝对。可能不同的人看会有不同的理解。如果我以后讲解的动态规划的设计思想与这里讲解的「设计状态思路」不一样的,我会再和大家说明。如果讲解有误导的地方,还请大家指出。,

我们 不知道和最大的连续子数组一定会选哪一个数,那么我们可以求出 所有 经过输入数组的某一个数的连续子数组的最大和。

例如,示例 1 输入数组是 [-2,1,-3,4,-1,2,1,-5,4] ,我们可以求出以下子问题:

子问题 1:经过 −2的连续子数组的最大和是多少;
子问题 2:经过 1的连续子数组的最大和是多少;
子问题 3:经过 −3-的连续子数组的最大和是多少;
子问题 4:经过 4的连续子数组的最大和是多少;
子问题 5:经过 −1的连续子数组的最大和是多少;
子问题 6:经过 2的连续子数组的最大和是多少;
子问题 7:经过 1的连续子数组的最大和是多少;
子问题 8:经过 −5的连续子数组的最大和是多少;
子问题 9:经过 4的连续子数组的最大和是多少。
一共 9 个子问题,这些子问题之间的联系并没有那么好看出来,这是因为 子问题的描述还有不确定的地方(这件事情叫做「有后效性」,我们在本文的最后会讲解什么是「无后效性」)。

例如「子问题 3」:经过 −3的连续子数组的最大和是多少。

「经过 −3 的连续子数组」我们任意举出几个:

[-2,1,-3,4] ,−3是这个连续子数组的第 3 个元素;
[1,-3,4,-1] ,−3是这个连续子数组的第 2 个元素;
……
我们不确定的是:−3是连续子数组的第几个元素。那么我们就把 −3定义成连续子数组的最后一个元素。在新的定义下,我们列出子问题如下:

子问题 1:以 −2结尾的连续子数组的最大和是多少;
子问题 2:以 1结尾的连续子数组的最大和是多少;
子问题 3:以 −3结尾的连续子数组的最大和是多少;
子问题 4:以 4结尾的连续子数组的最大和是多少;
子问题 5:以 −1结尾的连续子数组的最大和是多少;
子问题 6:以 2结尾的连续子数组的最大和是多少;
子问题 7:以 1结尾的连续子数组的最大和是多少;
子问题 8:以 −5结尾的连续子数组的最大和是多少;
子问题 9:以 4结尾的连续子数组的最大和是多少。
我们加上了「结尾的」,这些子问题之间就有了联系。我们单独看子问题 1 和子问题 2:

子问题 1:以 −2结尾的连续子数组的最大和是多少;
以 −2结尾的连续子数组是 [-2],因此最大和就是 −2。

子问题 2:以 1结尾的连续子数组的最大和是多少;
以 1结尾的连续子数组有 [-2,1] 和 [1] ,其中 [-2,1] 就是在「子问题 1」的后面加上 1 得到。−2+1=−1<1 ,因此「子问题 2」 的答案是 1。

大家发现了吗,如果编号为 i 的子问题的结果是负数或者 0 ,那么编号为 i + 1 的子问题就可以把编号为 i 的子问题的结果舍弃掉(这里 i 为整数,最小值为 1 ,最大值为 8),这是因为:

一个数 a 加上负数的结果比 a 更小;
一个数 a 加上 0的结果不会比 a 更大;
而子问题的定义必须以一个数结尾,因此如果子问题 i 的结果是负数或者 0,那么子问题 i + 1 的答案就是以 nums[i] 结尾的那个数。
因为我们把子问题定义的更清楚,子问题之间的联系就容易观察到。这是我们定义子问题、定义状态的经验。

接下来我们按照编写动态规划题解的步骤,把「状态定义」「状态转移方程」「初始化」「输出」「是否可以空间优化」全都写出来。

定义状态(定义子问题)
dp[i]:表示以 nums[i] 结尾 的 连续 子数组的最大和。

说明:「结尾」和「连续」是关键字。

状态转移方程(描述子问题之间的联系)
根据状态的定义,由于 nums[i] 一定会被选取,并且以 nums[i] 结尾的连续子数组与以 nums[i - 1] 结尾的连续子数组只相差一个元素 nums[i] 。

假设数组 nums 的值全都严格大于 0,那么一定有 dp[i] = dp[i - 1] + nums[i]。

可是 dp[i - 1] 有可能是负数,于是分类讨论:

如果 dp[i - 1] > 0,那么可以把 nums[i] 直接接在 dp[i - 1] 表示的那个数组的后面,得到和更大的连续子数组;
如果 dp[i - 1] <= 0,那么 nums[i] 加上前面的数 dp[i - 1] 以后值不会变大。于是 dp[i] 「另起炉灶」,此时单独的一个 nums[i] 的值,就是 dp[i]。
以上两种情况的最大值就是 dp[i] 的值,写出如下状态转移方程:

代码:

class Solution {public int maxSubArray(int[] nums) {int res=nums[0];for(int i=1;i<nums.length;i++){nums[i]+=Math.max(nums[i-1],0);res=Math.max(res,nums[i]);}return res;}
}

结果:

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

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

相关文章

色彩的基础知识——适用于camera tuning

#灵感#AWB CC是图像调优中的一个重要色彩部分&#xff0c;了解一些色彩知识。 目录 1、光谱的颜色-------滤光片、颜色风格 2、人眼的明暗视觉-----------侧向光学&#xff0c;对比度、色噪 3、视觉残留-------帧率 4、颜色的明度、色调、饱和度 5、三基色 RGB---------调…

CRM系统怎样帮助企业提高客户服务能力?

在企业的经营过程中&#xff0c;绝不是追求“一锤子买卖”&#xff0c;而是与客户建立长期稳定的关系&#xff0c;从而获得更多的收益。CRM客户关系管理系统顾名思义&#xff0c;就是帮助企业管理客户关系的软件。下面说说&#xff0c;如何通过CRM提高客户服务能力? CRM可以帮…

融合语言模型中的拓扑上下文和逻辑规则实现知识图谱补全11.18

融合语言模型中的拓扑上下文和逻辑规则实现知识图谱补全 摘要1 引言2 相关工作2.1 事实嵌入法2.2 拓扑嵌入方法2.3 规则融合方法2.4 基于LM的方法 3 准备3.1 知识图谱和拓扑上下文3.2 KG中的逻辑规则4.3 三元组嵌入 5 实验和结果5.1 数据集和评价指标 摘要 知识图补全&#xf…

【算法心得】minus instead of add

https://leetcode.com/problems/minimum-amount-of-time-to-collect-garbage/description/?envType=daily-question&envId=2023-11-20 Here is my code: function garbageCollection(garbage: string[], travel: number[]): number

Django与Ajax

一、什么是Ajax AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML&#xff0c;现在更多使用json…

京东大数据(京东数据采集):2023年Q3线上投影仪品类销售数据分析报告

11月初&#xff0c;某知名投影仪企业发布了2023年三季度财报。数据显示&#xff0c;今年第三季度&#xff0c;公司营收依然不客观&#xff0c;连续第五个季度业绩持续下滑。 从鲸参谋数据也可以看出&#xff0c;今年Q3&#xff0c;京东平台上该品牌的销量环比下滑约35%&#x…

工程项目立项需要做哪些准备?

工程项目立项是一个复杂的过程&#xff0c;需要进行多方面的准备工作。这些准备工作对于项目的顺利进行至关重要&#xff0c;下面将详细介绍工程项目立项需要做哪些准备。 一、项目前期调研 在进行工程项目立项之前&#xff0c;需要进行充分的前期调研。这个阶段的主要目的是了…

MATLAB常用绘图函数的使用

文章目录 绘制一图一线绘制一图多线用法一&#xff1a;plot用法二&#xff1a;hold on 绘制一图多图其他形式的坐标图分段函数绘制方法一&#xff1a;分段写函数的定义域值域方法二&#xff1a;判断定义域方法三&#xff1a;if else 判断 横纵坐标范围设置标题、轴标签、图例、…

4-2计算小于1000的正整数的平方根

#include<stdio.h> #include<math.h> int main() {int i;int t;printf("请输入一个数:");scanf("%d",&i);if(i>1000){printf("请重新输入一个数&#xff1a;");scanf("%d",&i);}tsqrt(i);printf("%d的平方…

数字化文化的守护之星:十八数藏的非遗创新之道

在数字时代的浪潮中&#xff0c;十八数藏犹如一颗璀璨的守护之星&#xff0c;为传统文化注入了新的生命力。这个非遗创新项目以数字化为工具&#xff0c;以守护为使命&#xff0c;开辟了文化传承的新航道。 十八数藏是文化数字守护的引领者&#xff0c;通过数字技术&#xff0…

极智嘉(Geek+)官宣重磅合作伙伴,再度赋能仓储自动化解决方案落地

近日&#xff0c;全球仓储机器人引领者极智嘉(Geek)再度官宣重磅合作伙伴&#xff0c;其与全球先进的物流自动化和软件公司FORTNA达成了战略合作。 当前&#xff0c;电商领域发展迅速&#xff0c;高效、可拓展的订单履行方案需求急剧增长。基于这一形势&#xff0c;极智嘉与FO…

测试之路,女孩子软件测试-职业规划建议,路就在脚下...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试岗是不是加…

网站被攻击怎么办?德迅云安全SCDN为您保驾护航

安全加速&#xff08;Secure Content Delivery Network&#xff0c;SCDN&#xff09;是德迅云安全推出的集分布式DDoS防护、CC防护、WAF防护、BOT行为分析为一体的安全加速解决方案。已使用内容分发网络&#xff08;CDN&#xff09;或全站加速网络&#xff08;ECDN&#xff09;…

buildAdmin 后端控制器的代码分析

buildAdmin的代码生成&#xff0c;很像是 fastadmin 的生成模式&#xff0c;当我们利用数据库生成了一个控制器的时候&#xff0c;我们可以看到&#xff0c; 它的生成代码很简洁 <?phpnamespace app\admin\controller\askanswer;use app\common\controller\Backend;/*** 回…

day17-高速缓冲区的管理机制

1.目的 用户与磁盘进行文件交互时的流程 磁盘与高速缓冲区的关系 加深块设备驱动的理解 hash 循环链表 单链表的使用方法 2.高速缓冲区的工作流程 高速缓冲区中存储这对应的块设备驱动的数据 当从块设备中读取数据的时候&#xff0c;OS首先会从高速缓冲区中进行检索&#xff0…

Web UI 自动化测试方案(超级干货)看完不会你找我!

项目讨论 一、项目中符合自动化测试的部分有哪些&#xff1f;(目标和范围 scope&#xff0c; 准入准出标准) 1、稳定的需求点、变动较少的页面 2、每日构建后的测试验证 daily build 3、比较频繁的回归测试 4、需要在多平台上运行的相同测试案例、组合遍历型的测试、大量的重…

openssl1.0.2版本Windows安装问题

之前安装过1.1版本&#xff0c;Windows环境下C 安装OpenSSL库 源码编译及使用&#xff08;VS2019&#xff09;_vs2019安装openssl_肥宝Fable的博客-CSDN博客 后来发现linux编译不过&#xff0c;以为是版本问题&#xff0c;相差太大&#xff0c;所以降一下版本&#xff0c;以免…

Idea远程debug

Idea远程debug 一、方法 1.1、启动时加参数 java -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 -jar remote-debug-0.0.1-SNAPSHOT.jar1.2、运行时加参数 在没有显式-agentlib:jdwp参数的情况下进行远程调试&#xff1a; 首先&#xff0c;确保您的Sprin…

【unity实战】unity3D中的PRG库存系统和换装系统(附项目源码)

文章目录 先来看看最终效果前言素材简单绘制库存UI前往mixamo获取人物模型动画获取一些自己喜欢的装备物品模型库存系统换装系统装备偏移问题添加消耗品最终效果源码完结 先来看看最终效果 前言 之前2d的换装和库存系统我们都做过不少了&#xff0c;这次就来学习一个3d版本的&…

如何解决找不到vcruntime140_1.dll问题,亲测有效的5个解决方法分享

在您平常在电脑上正常操作时&#xff0c;有时可能会碰到一个很常见的困扰&#xff0c;那就是弹出一条“找不到vcruntime140_1.dll”的报错信息。这种情况常常是因为咱们在点击启动某个应用程序或者执行某项任务时&#xff0c;系统所需的一款叫作"vcruntime140_1.dll"…