假设给定一段没有任何限制的整数数列,求该数列中子序列和的的最大值.
解决该问题的方法有最直接的o(n^3)级求出所有子序列,逐个找出最大值的这种方法我们不在介绍,我们直接介绍时间复杂度为o(n)级的算法.
该问题的关键思路就是我们要抓住"任意一个负数开头的子序列不可能是最大和子序列" ,理解了这句后,接下来的问题简单许多,假如我们用该思想来处理上述样例: int []arr=''-2,11,-4,13,-5,-2".
首先我们设一个thisSum变量和maxSum变量,我们先让thisSum += arr[i]; ,然后再判断thisSum是否大于maxSum,如果大于就让maxSum = thisSum;.然后我们再就行判断是否thisSum<0了,如果小于0了,我们就给他赋0,让他舍弃之前保存到的子序列和.
我们给出代码:
public static void main(String[] args) {
int maxSum = Integer.MIN_VALUE;
int []arr= {-1,-4,-7,-8};
int thisSum = 0;
for (int i = 0; i < arr.length; i++) {
thisSum += arr[i];
if (thisSum > maxSum)// thisSum在[0,maxSum]之间时不需要任何处理
maxSum = thisSum;
else if (thisSum < 0)// 说明加上当前元素使得子序列为负数了,那么抛弃这段子序列(相当于thisSum赋值为0),从下一轮for开始
thisSum = 0;
}
System.out.println(maxSum);
}