首頁>技術>

請看示例:

示例 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.最大子序和 的變形,採用動態規劃

7
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 面試被吊打系列:氣得我直接把簡歷上的精通資料庫給刪掉了