2021 后端筆試準備 09 (動態(tài)規(guī)劃:不相連的元素的最大和)

題目描述:

輸入一個int類型的數(shù)組,計算不相連的元素的最大和,

例如:在圖片中的這個例子中,7和10是相連的所以他們不能相加,7 和 12 是不相連的所以他們可以相加,結果為19。

圖中最大的不相連的和是 7 + 12 + 14 = 33


解題思路:

運用圖中的公式 1, 迭代的去求三個數(shù)中最大的數(shù)是多少,直到數(shù)組尾部。

在圖中我給出了一個例子:

實現(xiàn)這個算法需要兩個 list 原數(shù)組遍歷過程中的所有不相鄰元素的最大值,用藍色數(shù)組表示,另一個是原數(shù)組用黑色表示

代碼:

這個是聽完講解之后寫出來的代碼,比較直觀,思路也和上面一模一樣。時間復雜度是O(n) 因為需要遍歷整個list,空間復雜度是O(n),因為創(chuàng)建了一個新的數(shù)組來存儲所有最大值。大家可以先想一想有沒有更優(yōu)化的寫法,再看下面更優(yōu)化的解析


下面是優(yōu)化的寫法,從公式出發(fā),我們可以看實際上我們每次更新只需要兩個值,如圖所示,所以我們只需要用兩個變量來記錄這兩個值,然后不斷的去更新他們就好了。

?這里是將最大值用變量first 代替, 加和的結果用second記錄,然后再把加和的結果賦值給first,這樣first的位置肯定在second的后面,因為first是0+2所以它在2的位置,然后再把first賦值給1,這樣原本first 是在0或者1的位置,這樣second和下一個需要加和的數(shù)必然是不相連的。

這樣就不需要用一個list來記錄最大值了,只用了兩個variable,所以這個寫法的時間復雜度只有O(1)



Reference:代碼來自Algoexpert,以學習作為主要目的來分享的。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容