刪除一次得到子陣列最大和(動態規劃)

2021-09-27 07:06:00 字數 1925 閱讀 4439

2. 用動態規劃,求出在刪除數字 i 後的子陣列最大值,存入新陣列中

3. 迴圈遍歷 dp[ ] 陣列,找出刪除一數後子陣列的最大值max_delete

4. 比較 max_delete 和 max_right_left ,得到最大值。

圖示解題

力扣 刪除一次得到子陣列最大和(動態規劃)

給你乙個整數陣列,返回它的某個 非空 子陣列(連續元素)在執行一次可選的刪除操作後,所能得到的最大元素總和。

換句話說,你可以從原陣列中選出乙個子陣列,並可以決定要不要從中刪除乙個元素(只能刪一次哦),(刪除後)子陣列中至少應當有乙個元素,然後該子陣列(剩下)的元素總和是所有子陣列之中最大的。

注意,刪除乙個元素後,子陣列 不能為空。

示例 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。

要解上面那道題,首先要先會寫這道題:

連續子陣列的最大和

輸入乙個 非空 整型陣列,陣列裡的數可能為正,也可能為負。

陣列中乙個或連續的多個整數組成乙個子陣列。

求所有子陣列的和的最大值。

要求時間複雜度為o(n)。

樣例輸入:[1, -2, 3, 10, -4, 7, 2, -5]

輸出:18

c**本題說明可以刪除乙個數字,即找出這個陣列中的某一數字x,用 x左邊剩餘陣列的最大值 + x右邊剩餘陣列的最大值 用動態規劃儲存在乙個新陣列中,從而找出此陣列中的最大值。

例如:求這個陣列刪除一數後的最大子陣列:

從第2位數開始遍歷(即 x 為 -2 ):

按照上面的思路,就會得到這樣的結果:

而通過求連續子陣列的最大和,即可求到

左邊陣列[1]的最大值為 1 ;

右邊[0, 3]的最大值為 3 ;

所以在刪除 -2 後,此陣列的最大值為 1 + 3 = 4。

然後繼續遍歷。

(1)左邊子陣列最大和

for

(i =

1; i < n; i++

)

(2)右邊子陣列最大和
for

(i = n -

2;i >=

0; i--

)

注意:因為可能存在不刪除數字就得到最大和的情況,所以要求出 left[ ] 陣列和 right[ ] 陣列中的最大值,用max_right_left記錄。

dp[0]

= left[0]

+ right[2]

for(i =

1;i < n -

1; i++

)

樣例

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

從圖中可以找到 max_right_left = 18

而 dp[ ] 數 組 的 max_delete = 22

所以此陣列在刪除第 5 個元素 -4 後,所剩餘陣列第子陣列最大和為 22 。

LeetCode連續子陣列的最大和 動態規劃

輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。1 arr.length 10 5,100 arr i...

leetcode 連續子陣列的最大和(動態規劃)

題目描述 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 示例1 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6 實現 def maxsubarray ...

最大和子陣列 動態規劃

題目 題意 給出乙個陣列,要求乙個子陣列,使得子陣列中所有元素之和最大,輸出最大值以及子陣列的首尾元素。思路 設d i 為以第i個元素結尾即num i 元素結尾的子陣列元素最大和 d i max 設p i 為以第i個元素結尾的子陣列的首元素的下標 當d i d i 1 num i 時,p i p i...