1186. Maximum Subarray Sum with One Deletion
題目網址:https://leetcode.cn/problems/maximum-subarray-sum-with-one-deletion/
題意:給一整數 array, 返回其 non-empty subarray(連續元素)在執行最多一次的刪除操作後, 所能得到的最大元素總和。
注意:刪除一個元素後的 subarray 不能為空。
Solution 1:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
arr
前先加上一個0
, 代表什麼元素都沒有的狀態noDel[i]
:arr[1:i]
中, 沒有任何刪除操作的最大 subarray 和oneDel[i]
:arr[1:i]
中, 有一次刪除操作的最大 subarray 和2. 得到狀態轉移方程:
noDel[i]
:由於沒有刪除操作, 故arr[i]
一定在 subarry 中, 因此有兩種可能
- 以
arr[i]
為結尾, 所有往前延伸之 subarray 中最大的(subarray.size() > 1
)
➔ 遞迴調用noDel[i - 1] + arr[i]
- 只有
arr[i]
(前面arr[0:(i-1)]
皆為負數, 加了只會更小, 不如不加)➔
noDel[i] = max(noDel[i - 1] + arr[i], arr[i])
oneDel[i]
:有兩種可能
arr[1:i]
沒任何刪除操作, 刪除的是arr[i]
➔noDel[i - 1]
arr[1:i]
已經有一次刪除操作, 所以arr[i]
不刪除
➔oneDel[i - 1] + arr[i]
➔
oneDel[i] = max(oneDel[i - 1] + arr[i], noDel[i - 1])
3. 初始化:
noDel[0]
、oneDel[0]
:當沒有元素時, 最大元素總和為0
noDel[1]
:只有一個元素arr[1]
時, 且沒有任何刪除操作
➔noDel[1] = arr[1]
oneDel[1]
:只有一個元素arr[1]
時, 且有一次刪除操作
**➔oneDel[1] = 0
**(arr[1]
被刪除)res
:照理來說,res
為上述兩者中取較大者, 也就是res = max(0, arr[1])
(arr[1]
有可能為負數)。但是, 題目有規定刪除一個元素後 subarray 不能為空, 所以當只有一個元素時, 是不能有任何刪除操作的, 所以res
只能為noDel[1]
, 也就是arr[1]
➔res = arr[1]
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(n)$ ➔
noDel
,oneDel
Solution 2:
想法:改進 Solution 1, 由於
noDel[i]
,oneDel[i]
只會用到第i - 1
次的狀態, 因此只需儲存上一次的狀態即可, 根本不需要開到 $O(n)$ space。由於oneDel[i]
會用到noDel[i - 1]
, 所以要先更新oneDel
, 再更新noDel
, 這樣才不會使oneDel
拿到新的noDel
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論