輸入乙個整型陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o(n)。
使用三種方式實現,分別是蠻力法:bf_maxsubarray,分治法:dc_maxarray,和o(n)實現的單迴圈法find_max。
#include"stdio.h"
#include"math.h"
#include"time.h"
#include"windows.h"
#define min_int -10000
#define max_int 10000
typedef structmaxinfo;
maxinfo bf_maxsubarray(int *a,int n)
} tmp = 0;
} return max;
}maxinfo dc_findmaxcrossingsubarray(int *a,int left,int mid,int right)
} maxinfo rightmax;
rightmax.max_left=mid+1;
rightmax.max_right = mid+1;
rightmax.max= min_int;
tmp = 0;
for(int j = mid+1;jrightmax.max)
}leftmax.max += rightmax.max;
leftmax.max_right = rightmax.max_right;
return leftmax;
}maxinfo dc_maxarray(int *a,int left,int right)
else }
void show(maxinfo max)
void find_max(int *ary,int arysize)
} printf("和最大的子陣列為:\n");
for(int j=start;j<=end;j++)
printf("= %d",max);
}void main()
; //;//
int i=clock();
show(bf_maxsubarray(a,n));
printf("\n**********====\n");
find_max(a,n);
printf("\n**********====\n");
printf("計算耗時:%dms\n",clock()-i);
int mid = (int)floor((n-1)/2);
show(dc_findmaxcrossingsubarray(a,0,mid,n-1));
maxinfo result;
large_integer nfreq;
large_integer nbegintime;
large_integer nendtime;
double time;
queryperformancefrequency(&nfreq);
queryperformancecounter(&nbegintime);
//開始
result = bf_maxsubarray(a,n);//dc_maxarray(a,0,n-1);
queryperformancecounter(&nendtime);
time=(double)(nendtime.quadpart-nbegintime.quadpart)/(double)nfreq.quadpart;
printf("%f微妙\n",time);
show(result);
printf("\n");
}
求整數陣列中和最大的子陣列的和
鄭雲飛 韓亞華 這個問題的複雜性和不確定讓我們讓我們想到了列舉,求出每乙個子陣列的和,但這樣我們我們程式的時間複雜度 將會非常高,於是我們想把辦法簡化它。首先我們將陣列裡連續的正數和負數就和,這樣我們將得到乙個正負相間的 整數陣列。然後再對正整數陣列求最大子陣列,這樣最大子陣列必定是兩頭為正,有奇數...
C 求整數陣列中和最大子串
現在有乙個陣列,陣列裡面有正數或者負數。如何計算其子串中和的最大值。比如,最大值的子串就應該是值為6 下面我直接給出 了,很簡單的,只是當時自己想錯了,所以這裡我把 重新寫了一遍 1 時間演算法為o n 2 2int maxseqint int a,int n 12 13 return s2 14 ...
求乙個整數 陣列中所有連續子陣列中和的最大值
信1101 2 胡弦琴 20113026 王兵茹 20112917 2014 03 10 15 35 37 這個時間點開始發表這篇部落格 剛把程式改好,由於胡弦琴要去上課,所以後續的部落格由我寫完 今天上午最後一節課老師叫我們結組兩個人共同乙個小程式的設計,也就是求乙個整數陣列中所有子陣列和的最大值...