1. 程式人生 > >返回一個整型數組中最大子數組的和

返回一個整型數組中最大子數組的和

學習 怎樣 動態 子數組和 記錄 結束 整型 題目 最大子數組

1.題目:返回一個整數數組中最大子數組的和。

要求:

輸入一個整形數組,數組裏有正數也有負數。

數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。

求所有子數組的和的最大值。要求時間復雜度為O(n)。

2.設計思想:

本題目最大的難點是如何找出子數組並且時間復雜度為O(n);我的思路是:從總左邊(a[0])開始遍歷整個數組,一直到最右邊結束(a[n-1]),在這個過程中記錄到目前為止最大的子數組和sofar。sofar初始化成0。假如我們已經找到a[0]到a[n-1]之間的最大子數組和,那麽a[0]到a[i]之間的最大子數組和是怎樣的呢?要麽“還是a[0]到a[i-1]之間的最大子數組和”,要麽是“從a[i]開始,往前幾個連續的數的最大值”。 在求從a[i]開始,往前幾個連續的數的最大值時,用到如下性質:從a[i]開始往前幾個連續的數的最大值maxending_i等於(maxending_i-1)+a[i]和0兩者之中的最大值,即maxending_i=max((manending_i-1)+a[i],0)

3代碼:

技術分享圖片

4.總結

剛開始本來打算是找出每一個子數組,再求其最大值,當寫程序時發現程序代碼比較麻煩,而且好多代碼的功能是重復的,於是我就開始閱讀上學期的數據結構的課本,找出了適合這個題目的思路。當我寫完後,感覺如果剛開始定義了數組的長度,那麽這個程序的使用範圍就收到限制,於是就思考怎麽能使數組的長度可以任意改變,然後我就想到了大一學習C++時講過的指針可以定義動態數組,於是在該程序中就使用了指針。

技術分享圖片

項目計劃總結:

技術分享圖片

時間記錄日誌:

技術分享圖片

返回一個整型數組中最大子數組的和