码迷,mamicode.com
首页 > 其他好文 > 详细

编程之美——子数组和最大值

时间:2014-08-18 21:52:52      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   io   数据   

解法一:直接求解下标i~j的子数组和最大值;复杂度O(N^2);

代码如下:

bubuko.com,布布扣
 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);

代码如下:

bubuko.com,布布扣
 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     else
25     {
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);

bubuko.com,布布扣
 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         else
24             sum+=arr[i];
25         if(sum>max)
26             max=sum;
27     }
28     return max;
29 }
View Code

 若问题推广:求二维数组中被矩形框起来数字和的最大值,该怎么解决呢?

                 思路:对N*M矩阵,先确定上下边界,之后将每一列数据相加—》一维情况,复杂度O(N^2*M);

                 若二维数组首尾相连成圆筒状,而采取分治法,同一维,分三种情况。

                 若二维数组上下相连成游泳圈状,问题有待解决;

编程之美——子数组和最大值,布布扣,bubuko.com

编程之美——子数组和最大值

标签:style   blog   http   color   使用   os   io   数据   

原文地址:http://www.cnblogs.com/chengyuz/p/3919583.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!