程式設計師面試題精選(03)-求子陣列的最大和
題目:輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為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這兩中情況呢?基於這個考慮,本人認為把子陣列和的最大值以引用的方式放到引數列表中,同時讓函式返回乙個函式是否正常執行的標誌。
· 輸入有一類特殊情況需要特殊處理。當輸入陣列中所有整數都是負數時,子陣列和的最大值就是陣列中的最大元素。
程式設計師面試題精選100題 03 求子陣列的最大和
題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。分析 本題最初為2005...
程式設計師面試題精選100題 03 求子陣列的最大和
題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。分析 本題最初為2005...
程式設計師面試題精選
問題描述 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。問題分析 這是一道很好的考查對遞迴理解的程式設計題。寫遞迴程式關鍵有兩點,處理好進入與返回的關係,進入時改變了什麼,返回時應當恢復。字...