求解一个数组中连续元素最大值

第一种实现是以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=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 = 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 = 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 = 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 = 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 = tmp;
91 }
92 return max_value;
93 }

 

 

 

 

转载于:https://www.cnblogs.com/ccccccccc/p/3754618.html

你可能感兴趣的:(求解一个数组中连续元素最大值)