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