乘積最大子串行 高階 leetcode

2021-08-22 10:10:55 字數 1144 閱讀 3365

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

示例 1:

輸入:[2,3,-2,4]輸出:6解釋:子陣列 [2,3] 有最大乘積 6。
示例 2:

輸入:[-2,0,-1]輸出:0解釋:結果不能為 2, 因為 [-2,-1] 不是子陣列。
這個題和前面的最大和子串行很相似,也可以達到o(n)的複雜度,但是不用之處在於,這裡乘積可能有負負得正的情況,因此要維護兩個陣列,分別是fp[i],fn[i],前者後者分別表示從第0位到第i位的最小乘積,和最大乘積。

遞推公式 :fp[i+1] =  max(fp[i]*nums[i+1],fn[i]*nums[i+1],nums[i+1])  和  fn[i+1] = min(fp[i]*nums[i+1],fn[i]*nums[i+1],nums[i+1])

理論上我們希望fp所有的元素都是正的,fn的元素都是負的,這樣才能更好的符合上述的公式,但是我們發現如果 序列是【1,2,3,4,5,-5,6】這樣的,那麼fp可以正確更新,但是fn得到的卻是 每個數子本身  而和之前沒有關係,其實這就相當於不用維護。

def maxproduct(self, nums):

""":type nums: list[int]

:rtype: int

"""fp = [0 for i in range(len(nums))]

fn = [0 for i in range(len(nums))]

fp[0],fn[0]=nums[0],nums[0]

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

fp[i+1] = max(fp[i]*nums[i+1],fn[i]*nums[i+1],nums[i+1])

fn[i+1] = min(fp[i]*nums[i+1],fn[i]*nums[i+1],nums[i+1])

return max(fp)

乘積最大子串行

比如,序列 2,3,2,4 中乘積最大的子串行為 2,3 其乘積為6。方法一 自己一開始寫的方法比較麻煩。通過記錄陣列中元素為0的下標,然後以0為邊界,分割陣列,然後對每個分割後的陣列分別求最大乘積子串行,最後在所有的分割陣列的最大乘積子串行中取最大乘積。class solution int len...

最大子串行乘積

思路 以元素i結尾序列提供的最大正數記做 pos,最小負數記做 nag a n 大於零時 pos n max max value max 若n 1位置存在最小負數,更新 nag n nag n 1 a n a n 小於零時 pos n max max value max 更新 nag n min a...

乘積最大子串行

給定乙個整數陣列 nums 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。由於存在負數,那麼最大的數可能變最小的數,最小的...