請看示例:
示例 1:輸入:arr = [1,-2,0,3] 輸出:4
解釋:我們可以選出 [1, -2, 0, 3],然後刪掉 -2,這樣得到 [1, 0, 3],和最大。
示例 2:輸入:arr = [1,-2,-2,3] 輸出:3
解釋:我們直接選出 [3],這就是最大和。
示例 3:輸入:arr = [-1,-1,-1,-1] 輸出:-1
解釋:最後得到的子陣列不能為空,所以我們不能選擇 [-1] 並從中刪去 -1 來得到 0。
我們應該直接選擇 [-1],或者選擇 [-1, -1] 再從中刪去一個 -1。
提示:1 <= arr.length <= 10^5
-10^4 <= arr[i] <= 10^4
解題思路分析1、動態規劃;時間複雜度O(n),空間複雜度O(n)
func maximumSum(arr []int) int { n := len(arr) dp := make([][2]int, n) dp[0][0] = arr[0] // 不刪 dp[0][1] = 0 // 刪除 res := dp[0][0] // 長度為1,不刪除 for i := 1; i < n; i++ { dp[i][0] = max(dp[i-1][0]+arr[i], arr[i]) dp[i][1] = max(dp[i-1][1]+arr[i], dp[i-1][0]) res = max(res, max(dp[i][0], dp[i][1])) } return res}func max(a, b int) int { if a > b { return a } return b}
2、動態規劃;時間複雜度O(n),空間複雜度O(1)
func maximumSum(arr []int) int { n := len(arr) a := arr[0] // 不刪 b := 0 // 刪除 res := a // 長度為1,不刪除 for i := 1; i < n; i++ { a, b = max(a+arr[i], arr[i]), max(b+arr[i], a) res = max(res, max(a, b)) } return res}func max(a, b int) int { if a > b { return a } return b}
總結Medium題目,leetcode53.最大子序和 的變形,採用動態規劃
最新評論