给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
示例1
输入
[1, -2, 3, 5, -2, 6, -1]
输出
12
来源
我:
抄的抄的。
一开始考虑的时候,把重点放在了 如何分割子数组 了,然后想不到。
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 cursum = 0;//当前和
int maxsum = Integer.MIN_VALUE;//已经记录的最大和
for (int i = 0; i < arr.length; i++) {
cursum += arr[i];//加上当前值得到当前和
maxsum = Math.max(cursum, maxsum);//当前和 和 已经记录的和 比较
cursum = (cursum < 0) ? 0 : cursum;//小于0就不用继续在这个基础上累加了
}
return maxsum;
}
}
大神:
总的想法差不多,它用了另一种方法来实现。
/*
总的来说,解题思路就是从前往后推,
要保证每个位置的值都起码比原本的大。
注意每次都要用m保存当前时刻的最大累积和,
最后直接返回就ok。
*/
class Solution {
public:
int maxsumofSubarray(vector<int>& arr) {
int m = 0; // 保存最大累加和
for(int i = 1 ; i<arr.size() ; i++)
{
arr[i] = max(arr[i] , arr[i-1]+arr[i]);
m = max(m, arr[i]);
}
return m;
}
};