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

分治 练习题

时间:2020-03-25 01:47:09      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:mat   ++   分治算法   小结   大连   练习题   stat   复杂度   最大   

最大连续和问题:长度为n的序列,求最大连续和。

 1 /**
 2      * 最大连续和问题:长度为n的序列,求最大连续和。
 3      * 枚举解法
 4      * 时间复杂度O(n^3)
 5      * @param a
 6      */
 7     public static int test1(int[] a) {
 8         int max=a[0];
 9         for(int i=0;i<a.length;i++) {
10             for(int j=i;j<a.length;j++) {
11                 int sum=0;
12                 for(int m=i;m<=j;m++) {//求[i,j]的和
13                     sum+=a[m];
14                 }
15                 if(sum>max)max=sum;
16             }
17         }
18         return max;
19     }
20     /**
21      * 最大连续和问题:长度为n的序列,求最大连续和。
22      * S[i]表示a[0]+...+a[i]则S[j]-S[i-1]表示[i,j]的和
23      * 时间复杂度:O(n^2)
24      * @param a
25      */
26     public static int test2(int[] a) {
27         //求S[i]
28         int[] s=new int[a.length];
29         s[0]=a[0];
30         for(int i=1;i<a.length;i++) {
31             s[i]=s[i-1]+a[i];
32         }
33         int max=s[0];
34         for(int i=1;i<a.length;i++) {
35             for(int j=i;j<a.length;j++) {
36                 if(s[j]-s[i-1]>max)
37                     max=s[j]-s[i-1];
38             }
39         }
40         return max;
41     }
42     /**
43      * 最大连续和问题:长度为n的序列,求最大连续和。
44      * 对test2的优化,s[j]-s[i-1]对于确定的j,s[i-1]越小结果越大,记录当前出现的最小值
45      * 时间复杂度O(n)
46      * @param a
47      */
48     public static int test3(int[] a) {
49         //求S[i]
50         int[] s=new int[a.length];
51         s[0]=a[0];
52         for(int i=1;i<a.length;i++) {
53             s[i]=s[i-1]+a[i];
54         }
55         int min=s[0],max=s[0];
56         for(int i=1;i<a.length;i++) {
57             if(s[i]-min>max) max=s[i]-min;
58             if(s[i]<min) min=s[i];
59         }
60         return max;
61     }
62     /**
63      *  最大连续和问题:长度为n的序列,求最大连续和。
64      * 分治算法
65      * 时间复杂度O(nlogn)
66      * @return
67      */
68     public static int test4(int[] a,int x,int y) {
69         if(y-x==1) return a[x];//只剩一个元素,直接返回
70         //划分
71         int m=x+(y-x)/2;
72         int maxs=Math.max(test4(a,x,m), test4(a,m,y));//[x,m) [m,y)
73         int v=0,L,R;
74         //从m向右
75         L=a[m];
76         for(int i=m;i<y;i++) {
77             L=Math.max(L, v+=a[i]);
78         }
79         //从m-1向左
80         v=0;R=a[m-1];
81         for(int i=m-1;i>=x;i--) {
82             R=Math.max(R, v+=a[i]);
83         }
84         return Math.max(maxs, L+R);
85     }

 可以看到本问题的分治法解法,将对数组求最大连续和的问题划分为求[x,m)[m,y)的最大值,以及在[x,y)之间的连续最大值的起点和终点(所以它算法是以m为划分点向两边扩散开,最后把L+R合并),这三个子问题,逐步求解

分治 练习题

标签:mat   ++   分治算法   小结   大连   练习题   stat   复杂度   最大   

原文地址:https://www.cnblogs.com/code-fun/p/12558740.html

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