求子陣列的最大和

2021-06-16 05:33:41 字數 1594 閱讀 5398

題目:輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。

要求:時間複雜度為 o(n)。 

例:輸入的陣列為 1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為 3, 10, -4, 7, 2,因此輸出為該子陣列的和 18。 

分析:本題最初為 2023年浙江大學計算機系的考研題的最後一道程式設計題,在2006 年裡包括 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 the input is invalid, return false 

if((pdata == null) || (nlength == 0)) 

return false; 

int ncursum = ngreatestsum = 0; 

for(unsigned int i = 0; i < nlength; ++i) 

ncursum += pdata; 

// if the current sum is negative, discard it 

if(ncursum < 0) 

ncursum = 0; 

// if a greater sum is found, update the greatest sum 

if(ncursum > ngreatestsum) 

ngreatestsum = ncursum; 

// if all data are negative, find the greatest element in the array       if(ngreatestsum == 0) 

ngreatestsum = pdata[0]; 

for(unsigned int i = 1; i < nlength; ++i) 

if(pdata > ngreatestsum) 

ngreatestsum = pdata; 

return true; 

求子陣列最大和

題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為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,因此輸...