LeetCode HOT 100:最大子数组和
题目: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:最大子数组和的更多相关文章
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [Leetcode] maximun subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [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 ...
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- [LeetCode] 53. Maximum Subarray 最大子数组
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- [leetcode]53. Maximum Subarray最大子数组和
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- [LeetCode] 53. Maximum Subarray 最大子数组 --动态规划+分治
Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...
- LeetCode Top 100 Liked 点赞最高的 100 道算法题
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:刷题顺序,刷题路径,好题,top100,怎么刷题,Leet ...
- 求一个数组的最大子数组(C/C++实现)
最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...
随机推荐
- PAT (Basic Level) Practice 1012 数字分类 分数 20
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1 = 能被 5 整除的数字中所有偶数的和: A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(26)-Fiddler如何抓取Android7.0以上的Https包-上篇
1.简介 众所周知,假如设备是android 7.0+的系统同时应用设置targetSdkVersion >= 24的话,那么应用默认是不信任安装的Fiddler用户证书的,所以你就没法抓到应用 ...
- Bootstrap5 如何创建多媒体对象
一.在Bootstra5中使用媒体对象 Bootstrap 媒体对象在版本 5 中已经停止支持了.但是,我们仍然可以使用 flex 和 margin 创建包含左对齐或右对齐媒体对象(如图像或视频)以及 ...
- 离线安装chrome浏览器的postman插件
最近开始研究webapi相关的东西,看到chrome浏览器的有个postman插件挺好用的,但是安装包下载下来以后会出现这种情况,这时候我们可以把crx后缀的改成zip格式的然后解压,然后选择开发者模 ...
- RAID5 IO处理之重构代码详解
1 作用 当阵列降级时,可以添加一块新盘进行重构,以恢复阵列的冗余. 2 发起重构 可以通过以下命令md并发起重构: mdadm -C /dev/md0 --force --run -l 5 -n 3 ...
- C++算法之旅、02 从木棒切割问题领悟二分法精髓
172.木棒切割问题 https://sunnywhy.com/problem/172 题目描述 给出n根木棒的长度,现在希望通过切割它们来得到至少k段长度相等的木棒(长度必须是整数),问这些长度相等 ...
- 使用jmx exporter采集kafka指标
预置条件 安装kafka.prometheus 使用JMX exporter暴露指标 下载jmx exporter以及配置文件.Jmx exporter中包含了kafka各个组件的指标,如server ...
- Python基础部分:11、文件和光标移动
目录 一.文件操作 1.文件的概念 2.代码打开文件的方式 二.文件读写模式 1.'r' 只读模式 read 2.'w' 只写模式 write 3.'a' 尾部追写模式 add 三.文件操作模式 1. ...
- .NET7 gRPC JSON转码+OpenAPI
gRPC JSON转码 gRPC JSON 转码允许浏览器应用调用 gRPC 服务,就像它们是使用 JSON 的 RESTful API 一样. 浏览器应用不需要生成 gRPC 客户端或了解 gRPC ...
- 面试 个人摸底监测 考察考察JS三座⼤⼭ 1. 原型和原型链 2. 作⽤域与闭包 3. 异步和单线程 (第四天)
01.如何判断⼀个变量是不是数组? let arr = [1,2,3,4] function fun(){ return arr instanceof Array } 02.如何使⽤class实现继承 ...