最大的连续子段和的O(n)解法

一个整形序列arr={1, -1, -2, 2, 3, 4,-9, -5},数字有正,有负数,求他的最大的连续子串和?

O(n)解法思路:
(1)从左到右,从数组中第一个数开始加和,arr中的每一个数记做arr[i](i从1开始),max初始值为0
(2)其实Sn=Sn-1+arr[n],如果Sn<arr[n]则Sn=arr[n]
(3)总是判断sum是否大于max,如果大于则max=sum

下面是整个思路的运算过程:

S1=1+0 >arr1      则S1=1         ->  max<s1,则max=s1=1
S2=S1+arr2=0>arr2 则S2=0         ->  max>s2, max不变 max=1
S3=S2+arr3=-2=arr3则S3=-2        ->  max>s3, max不变 max=1
S4=S3+arr4=0<arr4 则s4=arr4=2    ->  max<s4, max=s4=2
s5=s4+arr5=5>arr5 则s5=5         ->  max<s5, max=s5=5
s6=s5+arr6=9>arr6 则s6=9         ->  max<s6, max=s6=9
s7=s6+arr7=0>arr7 则s7=0         ->  max>s7, max不变 max=9
s8=s6+arr7=arr7   则s8=-5        ->  max>s8, max不变 max=9

代码实现(Java):

public class ComputeSeqSumPlus {

public static void main(String[] args) {
int[] arr = { 4, 3, 4, -1, -9, 100 };
int max = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {

sum += arr[i];
if (sum < arr[i]) {

sum = arr[i];
}
if (sum > max) {
max = sum;
}
}
System.out.println("The max sum is : " + max);

}

}

posted @ 2009-11-03 23:21  Chris Wang  阅读(565)  评论(0编辑  收藏  举报