編程之美——子數組和最大值

來源:互聯網
上載者:User

標籤: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);

                 若二維數組首尾相連成圓筒狀,而採取分治法,同一維,分三種情況。

                 若二維數組上下相連成遊泳圈狀,問題有待解決;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.