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
range
(len
(nums)):
dp[i]
[i]= nums[i]
max_product_i = dp[i]
[i]for j in
range
(i+1
,len
(nums)):
dp[i]
[j]= dp[i]
[j-1
]* nums[j]
max_product_i =
max(max_product_i,dp[i]
[j])
max_product =
max(max_product_i,max_product)
return max_product
時間複雜度 o(n
2)
o(n^2)
o(n2
)
對於子陣列問題按照最大子序和中的思路,定義dp[i] 為以i為結尾的子串的某種狀態。
嘗試1:
按照最大子序和那樣定義狀態dp[i]為以i為結尾的子串的最大乘積。
狀態轉移為: dp[i] = max(dp[i-1]*nums[i], nums[i])。
執行後發現這種狀態轉移不正確,如果當前的nums[i]為負數,以當前nums[i]為結尾的最大子串乘積此時有可能為該負數乘以該元素之前最小的負乘積,不一定是nums[i]乘以之前元素的最大乘積。
嘗試2:
狀態定義:同時定義了以i為結尾的子串的最大乘積dp_max[i]和以i為結尾的子串最小乘積dp_min[i].
狀態轉移:
class
solution
:def
maxproduct
(self, nums: list[
int])-
>
int:
dp_min =
[nums[i]
for i in
range
(len
(nums))]
dp_max =
[nums[i]
for i in
range
(len
(nums))]
max_product = nums[0]
for i in
range(1
,len
(nums)):
max_i = nums[i]
* dp_max[i-1]
min_i = nums[i]
* dp_min[i-1]
dp_max[i]
=max
(max_i,min_i,nums[i]
) dp_min[i]
=min
(max_i,min_i,nums[i]
) max_product =
max(max_product,dp_max[i]
)return max_product
對於子串問題可定義狀態dp[i]為以nums[i]結尾的子串的某種狀態
該問題比最大子序和問題加昇了難度。最大自序和問題只要每一狀態的子序和為最大對於後面的狀態就是最優的選擇,可以認為是單調的。而最大乘積問題,每一狀態的子序和最大時,後續狀態不一定在之前的最大乘積狀態下取得最大,例如有可能後面出現一負數,乘以前面子串的最小負乘積,負負得正這種情況下取得最大。所以每個狀態下也儲存最小的乘積。
對於max(dp[i-1]+nums[i], nums[i])的理解:
當前的狀態不一定是上一狀態的最優解+當前元素就是最優的,對於上一狀態的結果為負數情況,加上當前元素後更小了,此時只有當前元素時結果最優。
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...
152 乘積最大子陣列
題目描述 給你乙個整數陣列 nums 請你找出陣列中乘積最大的連續子陣列 該子陣列中至少包含乙個數字 並返回該子陣列所對應的乘積。示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。方法...