***
題目:輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o(n)。
例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2,因此輸出為該子陣列的和18。
分析:本題最初為2023年浙江大學計算機系的考研題的最後一道程式設計題,在2023年裡包括google在內的很多知名公司都把本題當作面試題。由於本題在網路中廣為流傳,本題也順利成為2023年程式設計師面試題中經典中的經典。
如果不考慮時間複雜度,我們可以列舉出所有子陣列並求出他們的和。不過非常遺憾的是,由於長度為n的陣列有o(n2)個子陣列;而且求乙個長度為n的陣列的和的時間複雜度為o(n)。因此這種思路的時間是o(n3)。
很容易理解,當我們加上乙個正數時,和會增加;當我們加上乙個負數時,和會減少。如果當前得到的和是個負數,那麼這個和在接下來的累加中應該拋棄並重新清零,不然的話這個負數將會減少接下來的和。基於這樣的思路,我們可以寫出如下**。
/// find the greatest sum of all sub-arrays
// return value: if the input is valid, return true, otherwise return false
/bool
findgreatestsumofsubarray
(int *pdata, // an array
unsigned
int nlength, // the length of array
int &ngreatestsum // the greatest sum of all sub-arrays)
// if all data are negative, find the greatest element in the array
if(ngreatestsum == 0)
}return
true;}
·函式的返回值不是子陣列和的最大值,而是乙個判斷輸入是否有效的標誌。如果函式返回值的是子陣列和的最大值,那麼當輸入乙個空指標是應該返回什麼呢?返回0?那這個函式的使用者怎麼區分輸入無效和子陣列和的最大值剛好是0這兩中情況呢?基於這個考慮,本人認為把子陣列和的最大值以引用的方式放到引數列表中,同時讓函式返回乙個函式是否正常執行的標誌。 ·
輸入有一類特殊情況需要特殊處理。當輸入陣列中所有整數都是負數時,子陣列和的最大值就是陣列中的最大元素。
求子陣列最大和
題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。因為是o n 的複雜度,...
求子陣列的最大和
題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 本題最初為2005年浙江大學計算機系的考研題的最後一道程式設計題,在2006年裡包括google在內的很多知名公司都把本題當作面試題。由於本...
求子陣列的最大和
陣列 一 題目 感謝 提供的題目 求子陣列的最大和 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸...