子数组的最大累加和问题
题目描述:
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
示例:
输入:[1, -2, 3, 5, -2, 6, -1]
输出:12
题目链接:
思路:
我们同样设置一个arr.length长的数组ans,这个数组的ans[i]的值代表着以ans[i]为结尾的连续子数组最大累计和。
根据上述思想我们根据示例来手写解答一下这个题:
代码:
import java.util.*;
public class Solution {
/**
* max sum of the subarray
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxsumofSubarray (int[] arr) {
// write code here
int length = arr.length;//arr数组的长度
int [] ans = new int [length];//定义一个length长的数组
ans[0] = arr[0];
for (int i = 1; i < length; i++) {
if (ans[i - 1] <= 0) {
ans[i] = arr[i];
}
else {
ans[i] = ans[i - 1] + arr[i];
}
}
int res = ans[0];
for (int i = 1; i < length; i++) {
if (res < ans[i])
res = ans[i];
}
return res;
}
}
简化后:
public int maxsumofSubarray(int[] arr) {
int length = arr.length;
int cur = arr[0];
int max = cur;
for (int i = 1; i < length; i++) {
cur = Math.max(cur, 0) + arr[i];
//记录最大值
max = Math.max(max, cur);
}
return max;
}