陣列之乘積最大子陣列

2021-10-08 02:35:22 字數 2376 閱讀 9178

給你乙個整數陣列 nums ,請你找出陣列中乘積最大的連續子陣列(該子陣列中至少包含乙個數字),並返回該子陣列所對應的乘積。

示例 1:

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

輸出: 6

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

示例 2:

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

輸出: 0

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

解析:

不包含0的情況

1.0 全為正數

這種情況最簡單,直接所有結果相乘即可。

2.1 偶數個負數

負負得正,這種情況也直接將結果相乘即可。

2.2 奇數個負數

奇數是2n+1(或者1+2n),這裡2n就是2.1中的情況,偶數個負數相乘結果肯定是正數,再把它附近的所有正數連在一起就構成了最大連乘的子區間。現在要解決的問題就是怎麼樣排除第乙個或者最後乙個負數,下面的解法比較巧妙。

從左往右乘,從右往左乘,最後兩個區間結果的最大值即為所求的最大連乘結果

包含0的情況

同上面一樣,分別從左往右以及從右往左連乘,一旦遇到0,那麼下乙個數就為它本身,表示區間從0處斷開。

為什麼呢?你想啊,你之前保留連乘的結果,不管正數還是負數,你都希望後面繼續有其他正數或者負數能與之相乘,使結果趨於更大。這時候來了個0,連乘更大的希望就瞬間破滅了,一夜回到解放前。那麼從下乙個數開始,你是選擇繼續為0呢,還是重拾希望呢?

綜上所述:

所有情況都可以通過從左往右連乘和從右往左連乘進行求解:

全為正數或者偶數個負數,從頭乘到尾最大

奇數個負數不含0,從左往右乘到最後乙個負數的左面為最大值,之後的乘積都為負數;從右往左乘到最前面乙個負數的右邊為最大值,再往前乘也都為負數;然後比較這兩個最大值,選取最大的那乙個

含有0的情況,同上,一旦遇到0,需要斷開,也就是後面的乘積要重新開始。

可以看到,以上所有情況都可以進行從左往右和從右往左進行連乘,然後求兩種方式的最大值,再選取最大的那乙個.

好了,看**

class

solution

:def

maxproduct

(self, nums: list[

int])-

>

int:

nums_reverse = nums[::

-1]for i in

range(1

,len

(nums)):

if nums[i -1]

!=0: nums[i]

*= nums[i -1]

if nums_reverse[i -1]

!=0: nums_reverse[i]

*= nums_reverse[i -1]

return

max(

max(nums)

,max

(nums_reverse)

)

解法二:

可以觀察到,

如果nums[i]<0,那麼當前最大值可以由前面的最小值和nums[i]相乘得到,

如果nums[i]>0,那麼當前最大值可以由前面的最大值和nums[i]相乘得到,

如果前面為0或者為負數,那麼nums[i]可能就是最大值

有點難懂,等吃透了再更新,先放**.

class

solution

:def

maxproduct

(self, nums: list[

int])-

>

int:

ans = nums[0]

pre_max = nums[0]

pre_min = nums[0]

for num in nums[1:

]:cur_max =

max(pre_max*num, pre_min*num, num)

# 儲存最大值

cur_min =

min(pre_max*num, pre_min*num, num)

# 儲存最小值,為下一輪做準備

ans =

max(ans, cur_max)

# 更新最大值

pre_max = cur_max

pre_min = cur_min

return ans

乘積最大子陣列

leetcode 乘積最大子陣列 一開始我並沒有用dp 而是分情況討論的,即通過0將資料分為幾段,因為含有0的必定會使結果為0 然後就是考慮負數 在所分的每段裡計算乘積,如果負數個數為奇數,將最後出現的那段除掉,然後輸出最大值再比較 非常長 但是可以跑過 長的我自己都不想看,沒臉看,看不明白啊,娘的...

乘積最大子陣列

給你乙個整數陣列 nums 請你找出陣列中乘積最大的連續子陣列 該子陣列中至少包含乙個數字 並返回該子陣列所對應的乘積。示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,3,2 輸出 12 解釋 子陣列 2,3,2 有最大乘積 12。對於每個元素,我...

最大子陣列乘積

題目鏈結 動態規劃的典型題目,這道題實際上是最大連續子陣列和的乙個高階版本。這道題的難點在於,這裡要同時構建兩個輔助陣列。f n f n f n 代表從區間 0,n 0,n 0,n 內,以n為結尾的最大乘積。與之相對的,g n g n g n 代表從區間 0,n 0,n 0,n 內,以n為結尾的最小...