53. 最大子数组和
思路
-
定义一个变量
currentSum表示以当前元素结尾的最大子数组和。 -
遍历数组时,对于每个元素
nums[i],我们有两种选择:- 将其加入前面的子数组(前提是前面的
currentSum > 0)。 - 从当前元素重新开始一个新的子数组(如果前面的
currentSum <= 0,说明前面的部分拖累了总和)。
- 将其加入前面的子数组(前提是前面的
-
使用一个变量
maxSum记录遍历过程中的最大值。
复杂度分析
- 时间复杂度:
O(n)
只需要遍历一次数组,每个元素只访问一次。 - 空间复杂度:
O(1)
只使用了两个额外变量currentSum和maxSum,不依赖于输入数组大小。
代码
class Solution {
public int maxSubArray(int[] nums) {
// 初始化
int currentSum = nums[0];
int maxSum = nums[0];
// 从第二个元素开始
for (int i = 1; i < nums.length; i++) {
// 如果加入当前元素后,和更小,直接从当前元素开始重新统计
currentSum = Math.max(nums[i], currentSum + nums[i]);
maxSum = Math.max(currentSum, maxSum);
}
return maxSum;
}
}

浙公网安备 33010602011771号