在一个数组中找出最大和的子数组(Largest Sum Contiguous subarray),这个问题第一次提出是在1977年ulf-grenander提出的。详见:http://en.wikipedia.org/wiki/Maximum_subarray_problem
初次见到这个题目时,除了暴力破解我没有其他思路。但是google了一下,找到了一个时间复杂度O(n)空间复杂度O(1)的算法:
int Solution::maxSum(int a[], int n) { int max=0; int tmax=0; for(int i=0;i<n;i++) { tmax=tmax+a[i]; if(tmax<0) { tmax=0; } max=max>tmax?max:tmax; } return max; }
int Solution::maxSum2(int a[], int n) { int max=0; int tmax=0; for(int i=0;i<n;i++) { tmax+=a[i]; if(tmax<0) { tmax=0; } else { // do not compare for all element. compare only // when tmax>0 max=max>tmax?max:tmax; } } return max; }
int Solution::maxSum3(int a[], int n) { int max=a[0],tmax=a[0]; for(int i=1;i<n;i++) { tmax=(tmax+a[i])>a[i]?(tmax+a[i]):a[i]; max=max>tmax?max:tmax; } return max; }
这个问题我同样只会实现暴力破解,时间复杂度为O(n^2):
int Solution::maxProduct(int a[],int n) { int max=a[0]; for(int i=0;i<n;i++) { int temp=a[i]; int tmax=temp; // max=tmax; for(int j=i+1;j<n;j++) { temp*=a[j]; tmax=temp>tmax?temp:tmax; } max=max>tmax?max:tmax; } return max; }
int Solution::maxProdect2(int a[], int n) { int max=1,tmax=1,tmin=1; for(int i=0;i<n;i++) { // if a[i]>0,update tmax,update tmin only tmin is negtive if(a[i]>0) { tmax=tmax*a[i]; tmin=tmin*a[i]<1?tmin*a[i]:1; } else if(a[i]==0) { tmax=1; tmin=1; } else { int temp=tmax; tmax=tmin*a[i]>1?tmin*a[i]:1; tmin=temp*a[i]; } max=max>tmax?max:tmax; } return max; }