LeetCode的一道算法题:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
分析:
我们可以假设数组的第一个元素认为是最大和maxSum,定义数组求和变量int sum = 0,则可以依次向后累加数组中其他元素sum += nums[i],如果sum < 0,则将sum = nums[i],因为sum < 0时再向后加和会变小。再利用maxSum = Math.max(maxSum, sum)可以选择出那个最大的和。
代码如下:
public int maxSubArray(int[] nums) {
int maxSum = nums[0];
int sum = 0;
for(int num : nums){
if(sum > 0)
sum += num;
else
sum = num;
maxSum = Math.max(maxSum, sum);
}
return maxSum;
}
代码优化:
public int maxSubArray(int[] nums) {
int maxSum = nums[0];
int sum = 0;
for(int num : nums){
sum = Math.max(sum + num, num);
maxSum = Math.max(maxSum, sum);
}
return maxSum;
}