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在里面,不过总体的思路是这 ...
随机推荐
- 源码学习之MyBatis的底层查询原理
导读 本文通过MyBatis一个低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查询流程,从配置文件的解析到一个查询的完整执行过程详细解读MyBatis的一次查询流程,通过本 ...
- 2.ElasticSearch系列之集群权限认证
1. 在master节点上创建秘钥库 export ES_PATH_CONF="/home/elasticsearch/config" && /usr/local/ ...
- 一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.简述MySQL中索引类型对数据库的性能的影响 2.RDB和AOF机制 3.Redis的过期键的删除策略 4.Redis ...
- MasaFramework -- 缓存入门与规则配置
概念 什么是缓存,在项目中,为了提高数据的读取速度,我们会对不经常变更但访问频繁的数据做缓存处理,我们常用的缓存有: 本地缓存 内存缓存:IMemoryCache 分布式缓存 Redis: Stack ...
- LcdTools如何添加图片画面到PX01显示
LcdTools打开点屏工程,切到"画面设置"栏,在"画面资源"栏选择"Picture"画面,先设置图片ID编号(此编号用于PG对图片编号, ...
- C#--String.Substring方法
第一种:String.SubString(int start,int length) 截取指定长度的字符串 这里有两个int型的参数 string表示字符串截取的起始位置,length表截取的 ...
- 八、Django的组件
8.1.中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响 ...
- apijson 初探
apijson 初探 本文试着用 5W1H 方式切入,试图快速建立自己对 apijson 的整体认知,所以这不是一趟快速入门的 demo 之旅,而是显得比较务虚的探索式知识体系整合过程. 持续更新中. ...
- ES6 学习笔记(四)基本类型Number
1.数值 1.1 .JavaScript数值的特点 不区分整数值和浮点数值. 所有数值均用浮点数值表示. 采用IEEE-754标准定义的64位浮点数格式表示. 整数在实际操作时(如数组索引),则是基于 ...
- DevExpress窗体加载等待
using DevExpress.XtraEditors; using DevExpress.XtraSplashScreen; using System; using System.Collecti ...