标签: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