《程式設計之美》 求陣列的子陣列之和的最大值錯誤

2021-08-05 22:12:11 字數 1278 閱讀 4780

我的裡面記錄了書中的乙個錯誤,好多年沒有翻看那本書了,不知道現在那個問題糾正了沒有,當時仔細看的時候,貌似發現裡面的錯誤不止一兩處,記錄下來的現在翻看以前的部落格,就只有乙個了,可能當時太懶,沒全寫下來。

我閱讀了《程式設計之美——微軟技術面試心得》一書,無意間發現書中出現了乙個演算法上的錯誤。 

其問題在p184,《求陣列的子陣列之和的最大值》一章中的擴充套件問題。問題如下:如果陣列首尾相鄰,也就是我們允許找到一段數字(a[i].....a[n-1],a[0],....a[j])請使其和最大,怎麼辦? 

其中分為了兩種情況,錯誤處在書中對第二種情況的分析。其中 當i<=j時 則 m_2=a[0]+....+a[n-1],這一步驟是錯誤的。我舉一例陣列可以證明 900 -1000 1500 100 -1000 900.此時i

我對他們的演算法錯誤做出了以下分析。如圖: 

a————— c————————————b—————————————d 

此為整個字串,假設ab段為以a[0]為起點的和最大子串,那麼bd段之和必為非正。同理cd是以a[n-1]結尾的和最大字串,那麼ac段之和必為非正。所以cb段之和必然大於ad(整個字串)之和。 

以下是我對此題作出的正確分析: 

第一種情況:解沒跨過a[n-1]到a[0],原問題已給出解。 

第二種情況:解跨過a[n-1]到a[0],有第乙個問題想到不妨把陣列看成一條直線。解沒跨過時(第一種情況),這個解把陣列分成了前中後三段,其中前後段長度的可能為零。中間一段是和最大的子串,陣列和是一定的,當首尾相連,那麼前後端之和相加必然是和最小的。回到第二種情況看,由於最大字串跨過a[n-1]到a[0],那麼最小字串必然不跨過a[n-1]到a[0](情況類似情況一),所以不防用原問題解法求出陣列中和最小的字串,由於陣列之和不變,所以當你求出最小子串之和時,拿著總數組之和減去最小字串之和,就得到首尾段相加後和最大時得值。由於首尾相連,所以可以得到第二種情況的值。得到正解。 

另外,當第一次看到此題的時候,由於不求位置,我的第一想法就是把陣列縮短一下,乙個整數陣列無非包含正與負,把相連的同號的整數相加,例如陣列1 2 3 -4 -5 -6 7 8 -9 -10 可以縮成1+2+3=6 -4-5-6=-15 7+8=15 -9-10=-19 這種情況。 

以下是我寫的縮合程式 

int suojian(int *a ,int n) 

else a[k]=a[k]+a[i]; 

return k; 

} 如果對於較大的陣列,對於拓展後的問題,應該可以節省下來不少計算。 

剛接觸計算機,涉獵粗淺,不知道上面寫的有錯誤沒有,我只是提出了自己的看法,如果上面的有錯誤還望海涵

程式設計之美 求陣列的子陣列之和的最大值

前段子時間舍友恒恒問了我乙個問題 怎樣在乙個陣列中找到乙個子陣列使得各個元素之和最大,當時自己想了片刻,設定乙個變數sum,就說從左邊開始變數整個陣列,乙個個相加到sum中,發現了sum 0的話,就把sum設定為0就可以了,後來想了下,得到的結果未能保證正確,我們應該在遍歷的過程中儲存下sum的最大...

求陣列的子陣列之和的最大值(程式設計之美)

題目要求 乙個有n個整數元素的一維陣列 a 0 a 1 a n 2 a n 1 這個陣列當然有很多子陣列,那麼子陣列中和最大值是多少呢?1 子陣列是連續的 2 求子陣列的和,不用求子陣列的具體位置 3 陣列的元素時整數,所以陣列可能包含有正整數 零 負整數 解法一 暴力解法,從陣列的第0位開始遍歷陣...

程式設計之美2 14 求陣列的子陣列之和的最大值

問題描述 乙個有n個整數元素的一維陣列 a 0 a 1 a n 1 它包含很多子陣列,求子陣列之和的最大值,當陣列元素全部為負的時候,有兩種處理辦法,第一種是返回0,第二種是返回陣列中最大的負數。解法1 使用暴力法,假設最大的一段陣列為a i a j 則對i 0 n 1 j i n 1,遍歷一遍,求...