題目描述
給你乙個整數陣列nums
,請你找出陣列中乘積最大的連續子陣列(該子陣列中至少包含乙個數字),並返回該子陣列所對應的乘積。
示例 1:
輸入: [2,3,-2,4]
輸出: 6
解釋: 子陣列 [2,3] 有最大乘積 6。
示例 2:
輸入: [-2,0,-1]
輸出: 0
解釋: 結果不能為 2, 因為 [-2,-1] 不是子陣列。
題解:
動態規劃。
設f[i]
表示以nums[i]
結尾,nums[0...i]
中最大子陣列乘積,轉移方程:f[i] = max
如果這題是最大連續子陣列和
問題,這個方程沒問題,但是這題是乘積
,乘積意味著可以負負得正
,可能得到更大的結果。
假設nums =
,按上述轉移得到的f =
,最大結果為30
,而實際結果為所有元素的乘積,出現這種情況就是因為我們少考慮了負數
的情況。
所以,我們需要維護乙個fmin[i]
,表示以nums[i]
結尾,nums[0...i]
中最小子陣列乘積,設前面的f[i]
重新記為fmax[i]
,那麼轉移方程為:
時間複雜度:o(n
)o(n)
o(n)
額外空間複雜度:o(n
)o(n)
o(n)
class
solution);
fmin[i]
=min()
; ret =
max( ret, fmax[i]);
}return ret;}}
;/*記憶體:11.7mb,擊敗:58.58%
*/
可以發現,f
只跟f[i - 1]
有關,使用滾動陣列優化:
class
solution);
fmin =
min();
ret =
max();
}return ret;}}
;/*記憶體:11.3mb,擊敗:98.81%
*/
152 乘積最大子陣列
152.乘積最大子陣列 class solution def maxproduct self,nums list int int dp nums i for i in range len nums for j in range len nums max product dp 0 0 for i in...
152 乘積最大子陣列
給你乙個整數陣列 nums 請你找出陣列中乘積最大的連續子陣列 該子陣列中至少包含乙個數字 並返回該子陣列所對應的乘積。示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。class s...
152 乘積最大子陣列
類似於53題最大子序和,給乙個整數陣列 nums 找出陣列中乘積最大的連續子陣列 該子陣列中至少包含乙個數字 並返回該子陣列所對應的乘積。乘積最大,連續子陣列 乘積最大的連續子陣列,使用動態規劃方法 class solution def maxproduct self,nums if not num...