面試趣題 求不連續子陣列最大和的值

2022-02-25 07:52:35 字數 1643 閱讀 4435

《程式設計之美》一書上有一道題:給定乙個由n個整數元素組成陣列a,寫乙個函式在其中找出連續子陣列和的最大值。例如給定陣列為,則和最大的連續子陣列是,函式返回值是9。

這是一道典型的動態規劃問題,書中循序漸進地通過分析給出了乙個時間複雜度為o(n)空間複雜度為o(1)的最優解。我在面試時碰到了這道題的一道有趣變體,即同樣給定乙個陣列,寫乙個在其中找出不連續子陣列和的最大值,也就是說子陣列裡的任意相鄰的兩個元素,在原陣列裡都必須是不相鄰的才行。同樣以陣列為例,則和最大的不連續子陣列是,函式返回值是8。

顯然,最直接的思路我們可以採用窮舉法,對於此類尋找符合條件的子陣列的問題,無非就是對原陣列上每位元素是否屬於子陣列做一次遍歷判斷。由於每位元素都有屬於和不屬於子陣列兩種可能性,那麼窮舉的時間複雜度為o(2^n)。即使考慮「不連續」這個限制條件,即某位元素被選中屬於子陣列後,則其相鄰元素就一定不能被選中,也對時間複雜度的數量級不會有太多影響。因此很明顯,這絕對是個愚蠢的答案……

從《程式設計之美》一題中得到啟發,我們是不是也可以用動態規劃的方法來解這道題呢?假設從原陣列a第i位開始的最大不連續子陣列和為m[ i ],那麼它的值有兩種可能,一種是當前元素a[ i ]與隔一位上子問題解m[ i+2 ]之和(由不連續性質決定),另一種是不包含當前元素而直接等於前一位上子問題解m[ i+1 ],那麼我們可以寫出遞推公式為:m[ i ] = max(a[ i ] + m[ i+2 ], m[ i+1 ])。

等等,也許你要說,好像這個遞推式有漏洞啊,因為前一位上的解m[ i+1 ]本身就有可能是包含或不包含a[ i+1 ],假如m[ i+1 ]不包含a[ i+1 ],那麼豈不是還要考慮a[ i ]+m[ i+1 ]這種可能性呢?

這個遞推式真的經不起推敲嗎?我們不妨重新整理一下思路:由於原陣列上每一元素都有取與不取兩種可能,那麼也就對應有包含和不包含該元素的兩個子陣列的最大和。對於原陣列a中第i位上的元素,假設包含a[ i ]元素的子陣列最大和為s[ i ],而不包含元素a[ i ]的子陣列最大和為ns[ i ],因此所要求的不連續子陣列最大和m[ i ] = max(s[ i ], ns[ i ])。那麼根據題意我們可以整理出遞推關係如下:

s[ i ] = max(a[ i ] + ns[ i+1 ], a[ i ] + m[ i+2 ])

ns[ i ] = m[ i+1 ]

m[ i ] = max(a[ i ] + ns[ i+1 ], a[ i ] + m[ i+2 ], m[ i+1 ])

有趣的地方在於ns[ i ] = m[ i+1 ]這一項上,根據它我們可以得到ns[ i+1 ] = m(i+2),也就是說假如m[ i+1 ]不包含a[ i+1 ]的話,那麼它一定等於m[ i+2 ],所以a[ i ]+ns[ i+1 ]等價於a[ i ] + m[ i+2 ],遞推式m[ i ] = max(a[ i ] + m[ i+2 ], m[ i+1 ])是正確的!

從《程式設計之美》給出的解法中得到啟發,我們也只需要使用兩個變數來記錄m[ i+2 ]和m[ i+1 ]的值就行了,而且同樣只需要o(n)的複雜度就可以解這道題,**如下:

int maxsum(int* a, int n)

return m1;

}

圍爐取暖話「創業&公升職」,請看《走出軟體作坊

》;

圍爐取暖話「求職&面試」,請看《程式設計之美——微軟技術面試心得

求連續子陣列最大和

輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。例如輸入的陣列為 2,11,4,13,5,2 和最大的子陣列為11,4,13 因此輸出為該子陣列的和20。本題解法多種多樣,時間複雜度可以為 o n 3 o n 2 o ...

求連續子陣列的最大和

題目一 給定乙個陣列,求該陣列的最大子陣列和 與求最長連續子陣列互為姊妹題 題目二 給定乙個陣列,求該陣列的最大兩個子陣列的和 子陣列位置無重合 解題一 子陣列的最大和 技巧法 func getmaxsum arr int int res intmin cur 0 for ele range arr...

求連續子陣列的最大和

題目 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第3個為止 思路 從頭到尾逐個累加,儲存兩個值 當前和 最大和。public c...