题目:53. 最大子数组和

题目描述:

给你一个整数数组,在该数组的所有子数组中,找到一个子数组中所有元素相加和最大,返回这个最大的和。子数组就是一个数组中,由一个或几个下标连续的元素,组成的小数组,就叫原数组的子数组

思路:

这种求子数组怎么怎么的问题,都可以向一种思维上靠拢。即以某一个元素为结尾的子数组中,得到一个结果。然后以每一个元素都作为结尾,得到很多个结果,然后在这些结果中进行处理,一定得到正确的结果。

以本题举个例子:数组[-2,1,-3],先将每一个元素作为结尾的子数组的最大和求出来。

  • -2作为子数组结尾,只有[-2]一个子数组,最大和为-2
  • 1作为子数组结尾,有[-2,1][1]两个子数组,最大和为1
  • -3作为子数组结尾,有[-2,1,-3][1,-3][-3]三个子数组,最大和为-2

所以这道题将所有结果进行比较大小,一定找到一个正确结果为1。因为正确的答案一定是由某一个元素结尾的子数组得出来的。所以找到每一个元素结尾的子数组的结果,然后进行处理,一定得到正确结果。这种思维需要培养,遇到子数组怎么怎么的问题,看能不能尽量往这上面靠拢。

下面继续说这道题,还是举例数组[-2,1,-3],我们既然确定了方向,要获得以每一个元素结尾的子数组的最大和,最终将这些结果再取最大值。那么可以将这个问题拆分成几个小问题:

  • 子问题 1:以−2结尾的子数组的最大和是多少;
  • 子问题 2:以1结尾的子数组的最大和是多少;
  • 子问题 3:以−3结尾的子数组的最大和是多少;

我们单独看子问题 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的子问题的结果舍弃掉,这是因为:

一个数a加上负数或0的结果不可能比a更大;

而子问题的定义必须以一个数结尾,因此如果子问题i的结果是负数或者0,那么子问题i + 1的答案就是原数组i下标的那个数,因为前面的和被舍弃了。

步骤:

1、定义dp数组,表示以nums[i]结尾的子数组的最大和

2、遍历数组,根据上述思路,完善dp数组,并不断更新最大和

3、返回最大和

代码:

    public int maxSubArray(int[] nums) {
// dp[i] 表示:以 nums[i] 结尾的连续子数组的最大和
int[] dp = new int[nums.length];
dp[0] = nums[0]; int ans = nums[0];
for (int i = 1; i < nums.length; i++) {
if (dp[i - 1] > 0) {
dp[i] = dp[i - 1] + nums[i];
} else {
dp[i] = nums[i];
} // 更新最大值
ans = Math.max(ans, dp[i]);
} return ans;
}

空间优化代码:

    // 因为dp[i]只和dp[i - 1]有关,所以可以优化空间
public int maxSubArray(int[] nums) {
int pre = nums[0];
int ans = nums[0]; for (int i = 1; i < nums.length; i++) {
if (pre > 0) {
pre = pre + nums[i];
} else {
pre = nums[i];
} ans = Math.max(ans, pre);
} return ans;
}

LeetCode HOT 100:最大子数组和的更多相关文章

  1. [LeetCode] Maximum Subarray 最大子数组

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  2. [Leetcode] maximun subarray 最大子数组

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  3. [LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

  4. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  5. [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积

    Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...

  6. [LeetCode] 53. Maximum Subarray 最大子数组

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  7. [leetcode]53. Maximum Subarray最大子数组和

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  8. [LeetCode] 53. Maximum Subarray 最大子数组 --动态规划+分治

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  9. LeetCode Top 100 Liked 点赞最高的 100 道算法题

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:刷题顺序,刷题路径,好题,top100,怎么刷题,Leet ...

  10. 求一个数组的最大子数组(C/C++实现)

    最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...

随机推荐

  1. Elasticsearch:如何调试集群状态 - 定位错误信息

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/108973356

  2. ERP 系统的核心是什么?有什么作用?

    ERP系统的核心就是系统的内部业务逻辑,这也是ERP复杂.专业性的体现!ERP系统需要适配企业的管理思想和业务流程,在技术上面也也要做到快速部署和个性化定制(客户化定制),而这些企业的规模不同.行业不 ...

  3. 猫狗识别-CNN与VGG实现

    本次项目首先使用CNN卷积神经网络模型进行训练,最终训练效果不太理想,出现了过拟合的情况.准确率达到0.72,loss达到0.54.使用预训练的VGG模型后,在测试集上准确率达到0.91,取得了不错的 ...

  4. 【linux】 第1回 linux运维基础

    目录 1. 运维的本质 2. 电脑与服务器 2.1 电脑的种类 2.2 服务器种类 2.3 服务器品牌 2.4 服务器尺寸 2.5 服务器内部组成 3. 磁盘阵列 4. 系统简介 5. 虚拟化 6. ...

  5. Docker | redis安装及测试

    此篇文章目的是熟悉一下redis的下载安装使用,为后面部署redis集群做准备. 下载安装 linux上,我在/download目录下,执行下载的命令 root@--- ~]# wget http:/ ...

  6. C++ 函数重载解析策略

    参考<C++ Primer Plus>(第6版)中文版,Stephen Prata 著,张海龙 袁国忠译,人民邮电出版社.C++ 使用重载解析策略来决定为函数调用使用哪一个函数定义.重载解 ...

  7. C# 8.0 中的 Disposable ref structs(可处置的 ref 结构)

    官方文档中的解释:   用 ref 修饰符声明的 struct 可能无法实现任何接口,因此无法实现 IDisposable. 因此,要能够处理 ref struct,它必须有一个可访问的 void D ...

  8. JS中对DOM元素的操作

    https://www.runoob.com/jquery/jquery-ref-html.html 1.each  遍历 //遍历所有class为checksingle的DOM元素 $(" ...

  9. N32G4系列——复用功能重映射(USART为例)

    开发测试环境:SDK,N32G455x系列芯片 在国民MCU中G系列IO口有第二复用功能,这时需要用到重映射功能. 一.系列芯片手册定义 1.1.芯片IO口默认功能查看 如图,在该系列芯片的数据手册中 ...

  10. costool - 腾讯云cos快捷工具。

    目录 使用截图 使用方法 配置文件 安装方法 其他 一个腾讯云cos(对象存储)非官方快速上传和下载的工具,使用官方go-sdk二次开发.可以用于以下场景. 备份一些配置文件,比如.bashrc .v ...