给定一个整数数组a,找到一个具有最大和的连续子数组(最少包含一个元素),返回其最大和。
用数组T[i] 来保存 当前最大的连续子数组,算法的思想大体是这样的,循环遍历每个数,然后每次检验d[i-1] 是否大于零,只要大于零就 T[i] = T[i-1]+a[i] ,如果d[i-1]<0 ,那么直接d[i]=a[i]
算法核心: T[i] = T[i-1]>=0?T[i-1]+a[i]:a[i]
按照上面算法核心走一遍
[-2] T[1] = -2; 在只有一个数的时候,他就是最大连续的最大和子数组
[-2,1] T[2] = 1; T[1] =-2 <0 所以前面的最大连续和是负数,a[2]加上它们肯定会变小,所以直接不要它
[-2,1,-3] T[3] = T[2]+a[3] =-2; T[2] =1>=0 所以在i之前的最大连续是正数,肯定要加上它
[-2,1,-3,4] T[4] = 4; T[3] < 0
[-2,1,-3,4,-1] T[5] = T[4] +a[5] = 3 ; T[4]>0
[-2,1,-3,4,-1,2] T[6] = T[5]+a[6] =5; T[5]>0
[-2,1,-3,4,-1,2,1] T[7] = T[6]+a[7] =6; T[6]>0
[-2,1,-3,4,-1,2,1,-5] T[8] = T[7]+a[8] =1;T[7]>0
[-2,1,-3,4,-1,2,1,-5,4] T[9] = T[8]+a[9] =5; T[8]>0
只需再遍历T[i],取出数组中最大数数即可,或者每一遍历的使用m来记录T[i] 的最大值,具体算法过程如下。
int getMaxSequnceSum(int[] a,int len){ int* T = new int[len]; T[0] = a[0]; for(int i=1;i<len;i++){ if(T[i-1]>0){ T[i] = a[i]+T[i-1]; }else{ T[i] = a[i]; } } int maxSequnceSum = T[0]; for(int i=1,i<len,i++){ if(T[i]>max){ maxSequnceSum = T[i] } }
delete [] T; return maxSequnceSum; }
以上两个循环可以合并为一个。
原文:https://www.cnblogs.com/shijianchuzhenzhi/p/13041383.html