例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
分析:首先我们会简单的想到把所有子组数都求出来,但是一个含n个数的数组有n(n+1)/2个子组数,而求和的时间复杂度是O(n),所以这种显然是不行的。
我们都知道当加一个负数时子组数会变小,所以负数是最好别加,但当负数的后一个数大于负数的绝对值那么要保证连续的情况下,这个负数还是有必要加的,于是我们就可以从这一点出发,一步一步求出最大子组数。
Solution 1: Analyze arrays
number by number
|
Step
|
Operation
|
Accumulated sum of sub-arrays
|
Maximum sum
|
|
1
|
Add 1
|
1
|
1
|
|
2
|
Add -2
|
-1
|
1
|
|
3
|
Discard previous sum -1, add 3
|
3
|
3
|
|
4
|
Add 10
|
13
|
13
|
|
5
|
Add -4
|
9
|
13
|
|
6
|
Add 7
|
16
|
16
|
|
7
|
Add 2
|
18
|
18
|
|
8
|
Add -5
|
13
|
18
|
public class GreatestSum{
public static int sum(int[] array){
if(array==null||array.length<=0){
System.out.println("error") ;
}
int n = array.length ;
int sumTemp = 0 ;
int sumMax = 0 ;
for(int i=0;i<n;i++){
sumTemp = sumTemp + array[i] ;
if(sumTemp<0){
sumTemp = 0 ;
}else if(sumTemp>sumMax){
sumMax = sumTemp ;
}
}
return sumMax ;
}
public static void main(String[] args){
int[] array = {1,-2,3,10,-4,7,2,-5} ;
System.out.println(sum(array)) ;
}
}《微软面试100题 In Java》03.子数组的最大和,布布扣,bubuko.com
原文:http://blog.csdn.net/speedme/article/details/20777255