LeetCode热题100--53.最大子数组和--中等
1. 题目
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
2. 题解
class Solution {public int maxSubArray(int[] nums) {int ans = nums[0];int sum = 0;for(int num : nums){if(sum > 0){sum += num;}else{sum = num;}ans = Math.max(ans,sum);}return ans;}
}
3. 解析
出自这位老师:画手大鹏:画解算法:53. 最大子序和
- int ans = nums[0];
ans变量初始化为数组的第一个元素,这表示在遍历开始时,默认的最大子数组和就是第一个元素。这是因为如果所有数都是负数的情况,最大值只能是其中最大的那个。 - int sum = 0;
sum变量用于跟踪当前正在考虑的连续子数组的和,初始化为0。这个初始值表示在遍历开始时还没有累加任何元素。 - for(int num : nums)循环体
这是一个遍历整个nums数组的循环,使用的是数组遍历的常见方式。
int num : nums:将循环变量num赋值为当前遍历的nums数组中的元素。 - if(sum > 0){ sum += num; } else { sum = num; }
这里的条件判断用于决定如何更新sum:
如果当前累积和sum大于0:这意味着继续向当前子数组中添加num不会使总和变为负数,反而可能会增加。因此,将num加到sum上。
否则(即sum <=0):意味着继续向当前子数组添加num会导致总和不增大或者变成负数。为了寻找可能更大的子数组和,应该重新开始一个新的子数组,其值就是当前的num。 - ans = Math.max(ans, sum);
在每一步循环中,更新ans为当前最大值与当前sum的最大值。
Math.max(ans, sum) 比较当前最大的ans和当前的sum,取较大的那个作为新的ans。 - }结束循环
结束for循环,继续处理下一个元素。 - return ans;
返回最终的ans值,即整个数组的最大子数组和。