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

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

心算 color ont mage 數組 結束 組成 sum 正數

要求:

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

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

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

思路分析:

這個問題是一個典型的貪心算法的問題,限制於O(n)的時間復雜度,也就是只能用一次循環,所以一般的動態規劃模型不經過優化很難完成。本題最關鍵的地方就是每次記錄部分數組和時如何設置回溯、回溯到什麽位置。這個題比較方便的地方在於數組中正負數都得有,也就是說得出的結果最差也得是個正數。好了,我們不妨設置一個用來記錄部分數組和的sum值,初值為0,一個用來記錄理想結果的max值,初值為數組中第一個元素的值a[0]。每次循環中,

sum + a[i]都要和0比較大小,如果小等於0,說明當前這個部分和沒有再記錄的必要了,即時後面有很大的數能抵消也不是最理想的結果,這時就需要回溯,很簡單,直接令sum = 0,從下次循環也就是下個位置重新記錄即可;如果大於0,那麽令sum = sum + a[i]這個好理解。再每次循環結束前,必須要記錄當前的最理想結果,也就是把maxsum中較大的值賦值給max

 1 int main(){
 2     cout << "數字要求:必須有正數和負數同時存在,可以有0" << endl;
 3     int len = 0;
 4     cout << "
輸入數組長度:"; 5 cin >> len; 6 int*a = new int[len]; 7 cout << "輸入" << len << "個數字:"; 8 for (int i = 0; i < len; ++i) 9 cin >> a[i]; 10 int sum = 0; 11 int max = a[0]; 12 for (int i = 0; i < len; ++i){ 13 if (sum + a[i] <= 0
)sum = 0; 14 else sum += a[i]; 15 max = max>sum ? max : sum; 16 } 17 cout << "最大子數組的和:"<<max << endl; 18 return 0; 19 }

測試截圖:技術分享圖片

技術分享圖片

總結:

經典的貪心算法題目,主要就是回溯的位置和何時回溯。

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