標籤:style blog http color 使用 os io 資料
解法一:直接求解下標i~j的子數組和最大值;複雜度O(N^2);
代碼如下:
1 #include<iostream> 2 using namespace std; 3 const int INF=1000000; 4 5 int maxSum(int arr[],int n); 6 7 int main() 8 { 9 int arr[7]={-2,5,3,-6,4,-8,6};10 cout<<maxSum(arr,7)<<endl;11 return 0;12 }13 14 int maxSum(int arr[],int n)15 {16 int result=-INF;17 int sum;18 for(int i=0;i<n;++i)19 {20 sum=0;21 for(int j=i;j<n;++j)22 {23 sum+=arr[j];24 if(sum>result)25 result=sum;26 }27 }28 return result;29 }View Code
解法二:使用分治法求解
原數組最大子數組可能位於mid左邊,mid右邊,或者橫跨mid,求出其最大值即可;
演算法複雜度O(NlogN);
代碼如下:
1 #include<iostream> 2 using namespace std; 3 4 const int INF=1000000; 5 6 int maxSum(int arr[],int l,int h); 7 int findMid(int arr[],int low,int mid,int high); 8 int maxNum(int a,int b,int c); 9 10 int main()11 {12 int arr[7]={100,101,-300,1,2,3,4};13 cout<<maxSum(arr,0,6)<<endl;14 return 0;15 }16 17 int maxSum(int arr[],int low,int high)18 {19 int sum1,sum2,sum3;20 21 //只有一個元素22 if(low==high)23 return arr[low];24 else25 {26 int mid=(low+high)/2;27 sum1=maxSum(arr,low,mid);28 sum2=maxSum(arr,mid+1,high);29 sum3=findMid(arr,low,mid,high);30 31 return maxNum(sum1,sum2,sum3);32 }33 }34 35 //計算的最大子數組和橫跨左右兩個數組,求其最大值36 int findMid(int arr[],int low,int mid,int high)37 {38 int sumLeft=-INF;39 int sumRight=-INF;40 41 int sum=0;42 //向左43 for(int i=mid;i>=low;--i)44 {45 sum+=arr[i];46 if(sum>sumLeft)47 sumLeft=sum;48 }49 50 sum=0;51 for(int i=mid+1;i<=high;++i)52 {53 sum+=arr[i];54 if(sum>sumRight)55 sumRight=sum;56 }57 return (sumLeft+sumRight);58 }59 60 int maxNum(int a,int b,int c)61 {62 int num=max(a,b);63 return max(num,c);64 }View Code
解法三:對數組進行一次遍曆,時間複雜度O(N);
1 #include<iostream> 2 using namespace std; 3 4 int maxSum(int arr[],int n); 5 6 int main() 7 { 8 int arr[7]={-2,5,3,-6,4,-8,6}; 9 cout<<maxSum(arr,7);10 return 0;11 }12 13 int maxSum(int arr[],int n)14 {15 int max=arr[0];16 int sum=0;17 18 for(int i=0;i<n;++i)19 { 20 //若之前子數組和小於0,捨去,否則累加21 if(sum<0)22 sum=arr[i];23 else24 sum+=arr[i];25 if(sum>max)26 max=sum;27 }28 return max;29 }View Code
若問題推廣:求二維數組中被矩形框起來數字和的最大值,該怎麼解決呢?
思路:對N*M矩陣,先確定上下邊界,之後將每一列資料相加—》一維情況,複雜度O(N^2*M);
若二維數組首尾相連成圓筒狀,而採取分治法,同一維,分三種情況。
若二維數組上下相連成遊泳圈狀,問題有待解決;