通過這道題,你可以掌握
思路
演算法
遍歷陣列
遇到正數,
不斷累加,遇到的第乙個正數要記錄下標
遇到負數,
記錄下標,把此下標減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在內的很多知名公司都把本題當作面試題。由於本...