算法总结之 子数组的最大累加问题
给定一个数组arr, 返回子数组的最大累加和
要求 如果长度为N 要求时间复杂度O(N) 额外空间复杂度O(1)
解题思路:
如果没有正数 产生的最大累加和一定是 数中最大的那个
如果有正数 遍历到正数增加 遍历到负数减小 当小于0时候 说明累加到当前数出现了小于0的结果,那么累加的这一部分肯定不能作为生产最大累加和的子数组的右边部分。此时令其为0 编故事重新从下一个开始累加
当其大于等于0时, 每次累加都可能是最大的累加和,用另一个变量max全程跟踪记录出现的最大值即可
废话不多说,上代码一目了然
package TT; public class Test76 { public static int maxSum(int[] arr){ if(arr==null || arr.length==0){ 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; } public static void main(String[] args){ int[] arr = new int[7]; arr[0]=1; arr[1]=-2; arr[2]=3; arr[3]=5; arr[4]=-2; arr[5]=6; arr[6]=-1; int x = maxSum(arr); System.out.println(x); } }