動態規劃之最大子序和(53)

2022-07-01 18:09:10 字數 1066 閱讀 8462

給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4]

輸出: 6

解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

高階:

如果你已經實現複雜度為 o(n) 的解法,嘗試使用更為精妙的分治法求解。

題目求最大和,屬於求最值、最優解的問題。

按照常規的動態規劃思路,一般是這樣定義狀態 dp[i] 的:

dp[i] = nums[0...i] 中的「最大的子陣列和」
按照這個定義,無法由 dp[i] 推導 dp[i+1],因為題目求的最大和的子陣列是連續的,而狀態描述的是 nums[0...i] 中的「最大的子陣列和」,因此要重新定義狀態:

dp[i] = 以 nums[i] 為結尾的「最大的子陣列和」
使用數學歸納法來找狀態轉移方程:假設已經算出 dp[i-1] ,如何推導出 dp[i] 呢?

當子陣列遇到數字 nums[i] 時,有兩種選擇:要麼把 nums[i] 合併到子陣列中;要麼把 nums[i] 作為新的子陣列;求這兩種選擇中的最大值,即為 dp[i] ,因此得到狀態轉移方程:

dp[i] = max(dp[i-1] + nums[i], nums[i])
即 dp[0] = nums[0]。

這裡的結果輸出不再是常規的 dp[n] 了,而是在遍歷過程中找到最大值。

通過狀態轉移方程可知,dp[i] 只與前乙個狀態 dp[i-1] 有關,可以進行狀態壓縮,降低空間複雜度為 o(1) 。

func maxsubarray(nums int) int 

pre, m := nums[0], nums[0]

for i := 1; i < len(nums); i++

} return m

}func max(x int, y int) int

return y

}

動態規劃系列之 最大子序和

53.最大子序和 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。這道題不能用滑動視窗來做,因為陣列中含有複數,這樣就無法決定視窗的大小。和為s的連續正數序列 中便用到了滑動視窗 思路可看官方題解,講的很清楚,這裡不再贅述 也可參考 labuladon...

leetcode 53 最大子序和 (動態規劃)

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

力扣 53最大子序和 動態規劃

題目描述 給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。解題思路 動態規劃 使用乙個大小為len nums 的一維動態陣列,每個元素表示以...