返回一個整數數組中最大子數組的和
阿新 • • 發佈:2018-01-25
心算 color ont mage 數組 結束 組成 sum 正數 sum + a[i]都要和0比較大小,如果小等於0,說明當前這個部分和沒有再記錄的必要了,即時後面有很大的數能抵消也不是最理想的結果,這時就需要回溯,很簡單,直接令sum = 0,從下次循環也就是下個位置重新記錄即可;如果大於0,那麽令sum = sum + a[i]這個好理解。再每次循環結束前,必須要記錄當前的最理想結果,也就是把max和sum中較大的值賦值給max。
要求:
輸入一個整形數組,數組裏有正數也有負數。
數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。
求所有子數組的和的最大值。要求時間復雜度為O(n)
思路分析:
這個問題是一個典型的貪心算法的問題,限制於O(n)的時間復雜度,也就是只能用一次循環,所以一般的動態規劃模型不經過優化很難完成。本題最關鍵的地方就是每次記錄部分數組和時如何設置回溯、回溯到什麽位置。這個題比較方便的地方在於數組中正負數都得有,也就是說得出的結果最差也得是個正數。好了,我們不妨設置一個用來記錄部分數組和的sum值,初值為0,一個用來記錄理想結果的max值,初值為數組中第一個元素的值a[0]。每次循環中,
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 }
測試截圖:
總結:
經典的貪心算法題目,主要就是回溯的位置和何時回溯。
返回一個整數數組中最大子數組的和