小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
leetcode55题,最大子序和
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。https://leetcode-cn.com/problems/maximum-subarray/
解题思路分析
解法1
本题主要是从一个数组中遍历获取其中部分连续元素的最大和。本解法的主要思路是首先存储一个变量作为加和的记录。当加和临时变量小于0时,会对遍历的下一个变量产生反向影响,加和反而更小,这种情况下重新进行加和计算,并与之前的加和进行比较。而当加和的临时变量大于0时,则是对下一个遍历的变量产生正向加成,因此直接将当前加和与下一个变量值进行相加。每个变量相加后都进行与已存储变量的比较,从二者中选取更大的变量值重新存储。当遍历结束时,则得到所需求的最大子序和。代码如下:
public int maxSubArray(int[] nums) {
int res = 0;
int max = 0;
if(nums.length > 0){
max = nums[0];
res = max;
}
for (int i = 1; i < nums.length; i++) {
if(max > 0){
max += nums[i];
}else{
max = nums[i];
}
res = Math.max(res,max);
}
return res;
}
复杂度分析
- 时间复杂度 o(N) N为数组长度,只需要遍历一次数组即得到答案
- 空间复杂度 o(1) 仅存储了常量变量
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。