[Java]剑指offer:子数组的最大累加和问题
题目描述
给定一个数组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中没有正数,那么产生的最大累加和一定是数组中的最大值
如果arr中有正数,从左到右遍历arr,用变量cur记录每一步的累加和。
当cur<0的时候,说明累加的这一部分肯定不能作为产生最大累加和子数组的左边部分。所以此时让cur=0,表示cur从下一个数开始重新累加。当cur>0的时候,每次累加都可能是最大累加和,所以用另一个变量max全程跟踪记录cur出现的最大值即可。
import java.util.*; public class Solution { /** * max sum of the subarray * @param arr int整型一维数组 the array * @return int整型 */ public int maxsumofSubarray (int[] arr) { if(arr.length==0||arr==null){ return 0; } int max = Integer.MIN_VALUE; int cur = 0; for(int i = 0; i!=arr.length;i++){ cur += arr[i]; max = Math.max(max,cur); cur = cur<0?0:cur; } return max; } }