求陣列的子陣列之和的最大值

2021-07-08 15:50:05 字數 1361 閱讀 9602

乙個有n個整數元素的一維陣列( a[0], a[1], ... , a[n-2], a[n-1]),子陣列之和的最大值是什麼?(要求子陣列的元素是連續的)

例子:有陣列( -2, 5, 3, -6, 4, -8, 6),則其子陣列之和的最大值為8,其對應的陣列為(5,3)

解法一:

採用直接法

,記sum[i...j],為陣列a中從第i到第j之間所有數之和,算出所有sum,取其最大,**如下,時間複雜度o(n2):

int maxsum1(int *a, int n)

}return max;

}

解法二:使用分治法,陣列(a[0],a[1],...a(n-1)分為長度相等的兩段陣列(a[0],...,a[n/2-1])以及(a[n/2],...,a[n-1]),分別求出這兩段陣列各自的最大子段和,則原陣列(a[0],a[1],...a(n-1)的最大子段和分為3種情況

1).(a[0],a[1],...a(n-1)的最大子段和與(a[0],...,a[n/2-1])的相同

2).(a[0],a[1],...a(n-1)的最大子段和與(a[n/2],...,a[n-1])的相同

3).(a[0],a[1],...a(n-1)的最大子段和跨過(a[0],...,a[n/2-1])與(a[n/2],...,a[n-1])-

1)和2)可以根據遞迴可得,3)只要計算出以a[n/2-1]為結尾的一段陣列最大和s1=sum1[i...n/2-1]和a[n/2]為開頭一段陣列最大和s2=sum2[n/2...j],最後s=s1+s2.

這個演算法滿足分值演算法遞迴,總的時間複雜度o(n*log2n)

解法三:

假設我們已經知道(a[k].....a[n-1])最大的一段陣列和為all[k],並且已經計算出在(a[k].....a[n-1])中包含a[k]的最大的一段陣列和為start[k],那麼可以推斷出all[k-1]=max,利用

動態規劃思想

以及這樣的遞推公式,從後往前計算,**如下,時間複雜度o(n):

int max(int x, int y)

int maxsum2(int *a, int n)

return all[0];

}

對以上**進行簡化,因為最後所求到的變數只有start[0]和all[0],這樣可以反覆用nstart和nall,省略掉其他的變數,**如下

int max(int x, int y)

int maxsum2_v(int *a, int n)

return nall;

}

求陣列的子陣列之和最大值

題目 乙個有n個整數元素的一維陣列a 0.n 1 這個陣列當然有很多子陣列,那麼子陣列之和最大值是多少?解答 求子陣列之和最大,這裡是連續的子陣列,如果乙個數為負數,陣列之和會減少,記住最大值,只要陣列之和沒有小於0就可以繼續累加,比如,3到 1子陣列之和減小了,但是沒有小於0,可以繼續累加下乙個數...

求陣列的子陣列之和的最大值

本題的要求顯然是o n 級的複雜度咯 結合書上的分析,可以發現如下條件 從陣列右邊像左遍歷,當前下標為i,那麼最大值有3中情形 1.最大值為array i 2.最大值為array i maxsuminclude 3.最大值為不包括array i 的maxsumexclude 最後返回最大值 max ...

求陣列的子陣列之和的最大值

乙個有n個整數元素的一維陣列 a 0 a 1 a n 2 a n 1 這個陣列當然有很多子陣列,那麼子陣列之和的最大值是什麼呢?下面將給出3種解法的 解法一 int max maxsum1 int a,int n return maxnum 分析 該演算法的複雜度為o n2 解法二 思路 我們考慮陣...