leetcod 53 最大子序和演算法理解

2021-09-11 16:21:56 字數 1088 閱讀 2101

先上**

class solution 

return max;

}}

sum[i]為以第i個元素結尾且和最大的連續子陣列。假設對於元素i,所有以它前面的元素結尾的子陣列的長度都已經求得,那麼以第i個元素結尾且和最大的連續子陣列實際上,要麼是以第i-1個元素結尾且和最大的連續子陣列加上這個元素,要麼是只包含第i個元素,即sum[i]= max(sum[i-1] + a[i], a[i])。可以通過判斷sum[i-1] + a[i]是否大於a[i]來做選擇,而這實際上等價於判斷sum[i-1]是否大於0。由於每次運算只需要前一次的結果,因此並不需要像普通的動態規劃那樣保留之前所有的計算結果,只需要保留上一次的即可,因此演算法的時間和空間複雜度都很小。

個人理解:

比如我們我們有這樣乙個陣列 1, 2, 3,我們要判斷最大的子串行和,我們先列出所有情況:332

3212211

我們從陣列後面往前找,在所有的子串行中比較最大值。現在我們按照上面的思想sum[i]= max(sum[i-1] + a[i], a[i]),先從最後一位3開始看起,我們把以最後乙個數3的所有子串行列出來並分為兩部分,一部分是a[i]即3,另一部分是(sum[i-1] + a[i])

最後乙個數

剩下的子串行

332, 321, 2, 21,1

後面的序列實際可以拆成 3 + max(21,2),括號裡的序列其實就是以2為最後一位數字的最大序列和,依次遞迴還可以拆成以1為最後數字的最大序列和。所以我們最終能推出動態規劃的狀態方程sum[i]= max(sum[i-1] + a[i], a[i])。

接著再按照**的順序就可以理解。

我們還可以順便變化一下方程,sum[i-1] + a[i] < a[i] ⇒ sum[i-1] < 0,這個公式說明,如果我們在計算sum和的時候,加上最後乙個數如果碰到sum <0時便可以直接丟棄,因為這時sum[i]一定不是最大的子串行和,a[i]此時才是最大的。貼上**。

class solution 

if(sum < 0)

}return summax;

}}

53 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。兩個變數,乙個是ans,用來儲存 更新子串行 乙個maxn,始終儲存著當前最大的子串行。子串行...

53 最大子序和

題目 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。思路 因為要考慮連續,所以需注意兩點,與當前比較的必定包含當前節點的上乙個節點,前n個節點...

53 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。package le...