题目: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. C#高级特性(反射)

    今天来讲解反射的应用: 一.反射是什么? 简诉一下,反射就是.Net Framework 的一个帮助类库,可以获取并使用metadata(元数据清单):说的通俗易懂点,就是不用通过引用,仍然可以使用其 ...

  2. nsis使用URLDownloadToFile下载文件

    在Urlmon.dll中有个函数叫URLDownloadToFile,顾名思义,是一个用来下载文件的东西,我们做在线安装或者其他很多时候,往往需要提前下载一些小的文件来配置当前将要安装的程序,遇到这种 ...

  3. [笔记] 二维FFT

    假设现在有2个矩阵a和b,分别是n行m列和x行y列,现在你要计算它们的二维卷积,也就是求出矩阵s满足: \(s_{i,j}=\sum_{i'\leq i,j'\leq j}a_{i',j'}b_{i- ...

  4. 2016 ZCTF note3:一种新解法

    2016 ZCTF note3:一种新解法 最近在学习unlink做到了这道题,网上有两种做法:一种是利用edit功能读入id时整数溢出使索引为-1,一种是设置块大小为0使得写入时利用整数溢出漏洞可以 ...

  5. 『现学现忘』Git后悔药 — 32、revert撤销(一)

    目录 1.Git的三种后悔药 2.revert命令原理 3.revert命令的使用 (1)移除某次提交的修改 (2)revert命令说明 1.Git的三种后悔药 在Git中后悔药有三种:amend.r ...

  6. 一篇文章让你搞懂Java中的静态代理和动态代理

    什么是代理模式 代理模式是常用的java设计模式,在Java中我们通常会通过new一个对象再调用其对应的方法来访问我们需要的服务.代理模式则是通过创建代理类(proxy)的方式间接地来访问我们需要的服 ...

  7. Nacos基本学习

    一.注册中心 1.启动 1.下载nacos 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: GitHub主页:https://github.com/ali ...

  8. Linux之Docker-01

    一.镜像基础命令 1.docker version  [root@DY-Ubuntu-01 ~]#docker version               #查看 Docker 版本 2.docker ...

  9. gin框架——使用viper读取配置

    什么是viper Viper是Go应用程序的完整配置解决方案,包括12-Factor(也称为"十二要素",是一套流行的应用程序开发原则. 其实我也不是很清楚)应用程序.它被设计为在 ...

  10. SpringBoot&MyBatisPlus

    5. SpringBoot 学习目标: 掌握基于SpringBoot框架的程序开发步骤 熟练使用SpringBoot配置信息修改服务器配置 基于SpringBoot完成SSM整合项目开发 5.1 入门 ...