152 乘積最大子串行

2021-09-24 14:31:35 字數 1535 閱讀 9958

給定乙個整數陣列 nums ,找出乙個序列中乘積最大的連續子串行(該序列至少包含乙個數)。

示例 1:

輸入: [2,3,-2,4]

輸出: 6

解釋: 子陣列 [2,3] 有最大乘積 6。

示例 2:

輸入: [-2,0,-1]

輸出: 0

解釋: 結果不能為 2, 因為 [-2,-1] 不是子陣列。

如果要求不連續,把所有大於 0 的數字拿出來乘積

但是這裡需要連續的

1.暴力求解 遞迴

2.dp

dp 狀態定義:dp[i] 從最開始下表為0的位置一直到i元素位置的product subarray的最大值

還要求dp[n-1],dp[n-2]…dp[0]

狀態轉移方程:dp[i+1]=dp[i] *a[i+1]

a[i+1]為正數則正確,a[i+1]為負值的時候則會出現負值

所以 a[i+1]為正數 maxdp[i]

a[i+1]為負數數 mindp[i]

所以在dp定義的時候需要兩維度 另加一維度區分最大0最小1

新的狀態轉移方程為:

正的最大值dp[i,0]=

if a[i]>=0:

dp[i-1,0]*a[i]

else:

dp[i-1,1]*a[i]

負的最大值dp[i,1]=
if a[i]>=0:

dp[i-1,1]*a[i]

else:

dp[i-1,0]*a[i]

最後的值在dp[i,0] 求其中的max

class solution:

def maxproduct(self, nums: list[int]) -> int:

if nums is none:return 0

dp = [[0 for _ in range(2)] for _ in range(2)]

dp[0][1],dp[0][0],res = nums[0],nums[0],nums[0]

for i in range(1,len(nums)):

x,y = i % 2,(i-1) % 2 #滾動陣列節省空間

dp[x][0] = max(dp[y][0]*nums[i],dp[y][1]*nums[i],nums[i])

dp[x][1] = min(dp[y][0]*nums[i],dp[y][1]*nums[i],nums[i])

res = max(res,dp[x][0])

return res

152 乘積最大子串行

給定乙個整數陣列 nums 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。記錄每一處為止的列表乘積最大最小值,後一處乘積的...

152 乘積最大子串行

因為有負數和0的存在,使問題變得複雜了不少。用dp來做,而且要用兩個dp陣列,其中 1 f i 表示子陣列 0,i 範圍內並且一定包含nums i 數字的最大子陣列乘積,2 g i 表示子陣列 0,i 範圍內並且一定包含nums i 數字的最小子陣列乘積,3 初始化時f 0 和g 0 都初始化為nu...

152 乘積最大子串行

題目 給定乙個整數陣列 nums 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。動態規劃 defmaxproduct nu...