C語言強化(三)求子陣列的最大和

2021-07-01 23:29:37 字數 1501 閱讀 3138

通過這道題,你可以掌握

思路

演算法

遍歷陣列

遇到正數,

不斷累加,遇到的第乙個正數要記錄下標

遇到負數,

記錄下標,把此下標減1和之前記錄的正數的下標之間的陣列作為乙個可能最大陣列,

與之前的可能最大陣列比較,若變大,則取代!

判斷累加的值與負數大小關係

如果累加值大於負數,則繼續累加

如果累加值小於等於負數,捨棄此負數,向前移動,累加值清零

源**

#include #include#include #include#includeusing namespace std;

/**輸入乙個整形陣列,陣列裡有正數也有負數。

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

求所有子陣列的和的最大值。要求時間複雜度為 o(n)。

例如輸入的陣列為 1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為 3, 10, -4, 7, 2,

因此輸出為該子陣列的和 18。

思路連續數相加要最大,說明左右兩邊的數肯定不是負數

連續數序列中允許存在負數,前提是負數前面的一段正數相加要大於這個負數

演算法:遍歷陣列

遇到正數,不斷累加,遇到的第乙個正數要記錄下標

遇到負數,記錄下標,

把此下標減1和之前記錄的正數的下標之間的陣列作為乙個可能最大陣列,

與之前的可能最大陣列比較,若變大,則取代!

判斷累加的值與負數大小關係

如果累加值大於負數,則繼續累加

如果累加值小於等於負數,捨棄此負數,向前移動,累加值清零

*/void main()

else

} cout<

}else

/**判斷累加的值與負數大小關係

如果累加值大於負數,則繼續累加

如果累加值小於等於負數,捨棄此負數,向前移動,累加值清零

*/if(oriarray[i]+add>0)else

cout<=maxori&&i<=maxend;i++)

return sum;

}void main()

; cout<

解法二之所以比解法一簡練,在於他不僅僅意識到兩端的數不能為負數,而且只要那一串的子陣列相加小於0,就不可能是最大和子陣列的一部分。

每個問題都有其發生的規律,設計演算法的過程就是發現規律並加以利用的過程。

就好比打羽毛球,如果我發現只要我一回高遠球,對手就放短球,那麼我下次回完高遠就直接衝到網前準備撲殺。

C語言強化(三)求子陣列的最大和

通過這道題,你可以掌握 思路 演算法 遍歷陣列 遇到正數,不斷累加,遇到的第乙個正數要記錄下標 遇到負數,記錄下標,把此下標減1和之前記錄的正數的下標之間的陣列作為乙個可能最大陣列,與之前的可能最大陣列比較,若變大,則取代!判斷累加的值與負數大小關係 如果累加值大於負數,則繼續累加 如果累加值小於等...

求子陣列最大和

題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。因為是o n 的複雜度,...

求子陣列的最大和

題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 本題最初為2005年浙江大學計算機系的考研題的最後一道程式設計題,在2006年裡包括google在內的很多知名公司都把本題當作面試題。由於本...