MaxSubArray 最大子数列和

1 public int maxSubArray(int[] A) {
2            int newsum=A[0];
3            int max=A[0];
4            for(int i=1;i<A.length;i++){
5                newsum=Math.max(newsum+A[i],A[i]);
6                max= Math.max(max, newsum);
7            }
8            return max;
9         }

 

 

 1 int maxSubArray(int *a, const int length) 
 2 { 
 3     int maxSumSubArray = 0; 
 4     int sum_i = 0;  
 5     for(int i=0; i <length; i++) 
 6     { 
 7        sum_i = sum_i + a[i]; 
 8        if(sum_i < 0) sum_i = 0; 
 9         else 
10         { 
11             if(sum_i > maxSumSubArray) maxSumSubArray = sum_i; 
12         } 
13     } 
14  
15     //若是数组中的元素均为负值 
16     if(sum_i==0) 
17     { 
18         for(int i=0; i < length; i++) 
19         { 
20             if(a[i] > maxSumSubArray) maxSumSubArray = a[i]; 
21         } 
22     }    
23     return maxSumSubArray;     
24 } 

 

还有一种是分治算法 自己写的 复杂度O(nlogn)

 1 #include<iostream>
 2 using namespace std;
 3 int MaxSubArray(int *A,int low,int high){
 4     if(low==high) return A[low];
 5     int mid=(low+high)/2;
 6     int maxl=MaxSubArray(A,low,mid);
 7     int maxr=MaxSubArray(A,mid+1,high);
 8     int maxleft=A[mid],maxright=A[mid+1],maxsum;
 9     maxsum=A[mid];
10     if(mid-1>=low)
11     for(int i=mid-1;i>=low;i--){
12         maxsum=maxsum+A[i];
13         maxleft=max(maxsum,maxleft);
14     } 
15     maxsum=A[mid+1];
16     if(mid+2<=high)
17     for(int i=mid+2;i<=high;i++){
18         maxsum=maxsum+A[i];
19         maxright=max(maxsum,maxright);
20     } 
21     int cross=maxleft+maxright;
22     return max(cross,max(maxl,maxr));
23     
24 }
25 int main(){
26     int a[]={1,-4,1,3,-4,2};
27     cout<<MaxSubArray(a,0,5)<<endl;
28     return 0;
29 }

 

posted @ 2015-04-16 18:19  verlen  阅读(458)  评论(0编辑  收藏  举报