請看示例:
示例 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.最大子序和 的變形,採用動態規劃
最新評論
熱門排行
- GC類壓力管道安裝資質辦理,氨製冷(冷庫)管道定期檢驗程序
- 幾種PCBA表面處理的類型
- 歌禮制藥-B(01672)宣佈口服PD-L1小分子抑制劑前藥ASC61 用於治療晚期實體瘤的美國I期臨床試驗完成首例患者給藥
- 深耕CRO服務領域 宣泰醫藥(688247.SH)擬首次公開發行4534萬股
- 壓力容器許可證資質辦理,鉻鉬鋼製壓力容器結構設計規定
- 家裡有點地,這種果樹種上兩棵,栽到花盆裡,夏天就能結果子
- 家裡養株“大將軍”蘭花,花色喜慶,花大如盆,打理很簡單
- 庫存飆升!韓國半導體庫存激增80%
- 多點DMALL合夥人劉桂海:多點DMALL實踐實體零售數字化轉型
- 豬各階段拉稀的原因和解決方案,這篇文章告訴你答案,值得收藏