题目描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
[要求]
时间复杂度为O(n),空间复杂度为O(1)
示例
输入
[1, -2, 3, 5, -2, 6, -1]
输出
12
解题思路
- 将问题拆解为最小问题,拿最上面的示例举例,假若数组只有 [1, -2],当遍历到 -2 时,子数组和为 -1 ,最大和可以一眼看出是 1。假若数组增加一个元素 3,即 [1, -2, 3],根据上面已得出的 [1, -2] 子数组和为 -1 的结论,可得当前子数组和为 3 - 1 = 2,尽管 2 比上一次的最大和 1 还要大,但结果却比新加进来的 3 本身还要小,这并不是我们想要的,于是我们直接取 3 为最大子数组和。
- 根据上面的现象,我们可以推出,遍历数组 arr,如果 arr[i] 与前面的子数组之和相加,结果比 arr[i] 要大,那么 arr[i] 前面的子数组与 arr[i] 结合,成为一个新的子数组,否则 arr[i] 独自成为一个子数组。
- 因为题目要求了时间复杂度和空间复杂度,所以我们要合理重复利用系统提供的数组。
Java代码实现
public class Solution {
public int maxsumofSubarray (int[] arr) {
// 若数组为空,返回0;若数组只有1个元素,返回那个元素
if (arr == null || arr.length == 0) return 0;
else if (arr.length == 1) return arr[0];
// max记录最大子数组和
int max = 0;
// 记录每个位置与之前子集的加和
for (int i = 1; i < arr.length; ++i) {
arr[i] = arr[i] > arr[i] + arr[i-1] ? arr[i] : arr[i] + arr[i-1];
max = arr[i] > max ? arr[i] : max;
}
return max;
}
} 
京公网安备 11010502036488号