演算法1 最大連續子陣列

2021-09-05 10:03:41 字數 1113 閱讀 4523

真是好久好久都沒寫這個了,現在要重新開始學習,開始關於演算法的學習,計算機主要就是運算各種問題,做計算程式設計的人就是利用計算機進行各種運算,也就是說,做一些計算機的演算法,當然這個演算法不是數學的演算法。

這次寫的是最大連續子陣列問題。給定乙個陣列a[0,...,n-1],求a的連續子陣列,使得該子陣列的和最大。例如:

陣列:1,-5,5,6,-4,7,-20,8

最大連續子陣列為:5,6,-4,7

1. 首先這個可以直接用暴力法,將其求解出,所為暴力,就是遍歷所有可能的值,直接求解:

我們需要3個迴圈:最外層大迴圈為起始元素的迴圈,0≤i<n

中間迴圈為結束元素的迴圈,i≤j<n

最外層的迴圈為從i到j的求和遍歷,i≤k≤j

所以其時間複雜度為o(

int maxsubarray(int*a, int n,int *suba)

} }return maxsum;

}

執行結果為:

但,該計算複雜度過高,o(

2. 分治法,將陣列從中間分開,那麼最大陣列要麼完全在左半邊陣列,要麼完全在右半邊陣列,要麼跨立在分界點上。其中,完全在左陣列、右陣列遞迴解決;跨立在分界點上實際上是左陣列最大化字尾和右陣列最大化字首的和。所以使用遞迴的方法向前掃,向後掃即可。**如下:

int divideconquer(int*a, int from, int to)

int right = a[middle + 1];

now = a[middle + 1];

for (i = middle + 2; i <= to; i++)

int m3 = left + right;

return max(m1 , max(m2 , m3));

}

其時間複雜度為:o(nlogn),還算不錯。

3. 以s[i]為以a[i]結尾的shuz陣列中和最大的子陣列

則:s[i+1]=max(s[i]+a[i+1],a[i+1]),其中s[0]=a[0],0≤i≤n-1。

此為動態規劃,時間複雜度為o(n)。

最大連續子陣列

對於乙個給定的陣列a,求 a中連續子陣列,使得該陣列的和最大 例如 a 1,2,3,10,4,7,2,5 結果 3 10 4 7 2 暴力法 遍歷求a的所有子陣列,求和最大的 分治法 陣列的和最大那個陣列只會出現在以下三種情況中 a.存在於陣列下標從0到mid中,其中mid為陣列長度 length ...

最大連續子陣列

問題描述,給定乙個陣列a 0,1,n 1 求出a的連續陣列,使得該子陣列的和最大。例如 陣列a 1,2,3,10,4,7,2 則最大的子陣列為 3,10,4,7,2 解法 1.暴力法 2.分治法 3.動態規劃法 一 暴力發 分析 直接求解a i,j 的值,0 i n i j n,i,i 1,j 1的...

最大連續子陣列

題目 給乙個陣列,返回它的最大連續子串行的和 子向量的長度至少是1 例如 連續子向量的最大和為8 從第0個開始,到第3個為止 使用動態規劃 f i 以array i 為末尾元素的子陣列的和的最大值,子陣列的元素的相對位置不變 f i max f i 1 array i array i res 所有子...