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...