首页 > 代码库 > 求解一个数组中连续元素最大值
求解一个数组中连续元素最大值
第一种实现是以O(N3) 即以n的三次方实现的,这个算法很简单,想法特别明显
第二种以O(N2) 即以n的二次方实现,算法简单,但是仍然不够好
第三种 O(N*log(N)) ,以n乘以log(N),采取分治法解决问题,当然也采取了递归的思想。
第四种O(N),这个方法就无敌了,线性时间,如果数组是在磁盘或者磁带上面,只需要读取数组,不需要存储在内存上面(联机算法),此算法简洁高效,最理想的算法
5 int f1(int p[],int left,int right){
6 int tmp;
7 int max_value=http://www.mamicode.com/0;
8 for(int i = left;i <= right;i ++){
9 for(int j = i;j <= right;j ++){
10 tmp =0;
11 for(int k = i;k <= j;k ++){
12 tmp += p[k];
13 }
14 if(tmp >max_value){
15 max_value = http://www.mamicode.com/tmp;
16 }
17 }
18 }
19
20 return max_value;
21 }
23 int f2(int p[],int left,int right){
24 int tmp=0;
25 int max_value = http://www.mamicode.com/0;
26 for(int i =left;i <= right;i ++){
27 tmp = 0;
28 for(int j = left;j <= right;j ++){
29 tmp += p[j];
30 if(tmp > max_value)
31 max_value = http://www.mamicode.com/tmp;
32 }
33 }
34 return max_value;
35 }
37 int f3(int p[],int left,int right){
38 int left_max,right_max;
39 int return_left,return_right;
40 int center,tmp;
41 if(left == right){
42 if(p[left] < 0)
43 return 0;
44 else
45 return p[left];
46 }
47 center = (left + right) / 2;
48 return_left = f3(p,left,center);
49 return_right = f3(p,center+1,right);
50 left_max = 0;
51 tmp = 0;
52 for(int i = center;i >= left;i--){
53 tmp += p[i];
54 if(tmp > left_max)
55 left_max = tmp;
56 }
57
58 right_max = 0;
59 tmp = 0;
60 for(int i = center+1;i <= right;i ++){
61 tmp += p[i];
62 if(tmp > right_max)
63 right_max = tmp;
64 }
65 if(return_left > return_right){
66 if(return_left > (left_max + right_max) ){
67 return return_left;
68 }else{
69 return left_max + right_max;
70 }
71 }else{
72 if(return_right > (left_max + right_max) ){
73 return return_right;
74 }else{
75 return left_max + right_max;
76 }
77 }
78
79 }
82 int f4(int p[],int left,int right){
83 int tmp =0;
84 int max_value = http://www.mamicode.com/0;
85 for(int i = left;i <= right;i ++){
86 tmp += p[i];
87 if(tmp < 0)
88 tmp = 0; //it‘s means end the temp pos
89 else if(tmp > max_value)
90 max_value = http://www.mamicode.com/tmp;
91 }
92 return max_value;
93 }