最大的连续子段和的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);
}
}
作者:
Chris Wang
出处:
http://chriswang.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。