一、题目描述
给定一个数组arr,返回数组的最大累加和。
例:arr=[1,-2,3,5,-2,6,-1];所有的子数组中[3,5,-2,6]可以累加出最大的和12,所以返回12。
二、两种解法
思路一:暴力法
时间复杂度:O(n^2)
/**
* 暴力解法——O(n^2)
* @param arr
* @return
*/
private static int solve01(int[] arr) {
int maxSum = 0;
// i:以第i个元素开头的子数组
for (int i = 0; i < arr.length; i++) {
int sum = 0;
// 从arr[i]累加到arr[arr.length-1]
for (int j = i; j < arr.length; j++) {
sum += arr[j];
if (sum > maxSum) maxSum = sum;
}
}
return maxSum;
}
思路二:递推法
时间复杂度:O(n)
如果前面的累加和<0,即对最大累加和没有贡献,则应舍弃前面的数组。
/**
* 巧解:递推法——O(n)
* ——如果前面的累加和<0,即对最大累加和没有贡献,则应舍弃前面的数组。
* @param arr
* @return
*/
private static int slove02(int[] arr) {
int maxSum = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
if (sum < 0) sum = 0;
if (sum > maxSum) maxSum = sum;
}
return maxSum;
}
三、推荐——递推法