乘積最大子串行

2021-10-03 07:27:26 字數 886 閱讀 2519

本道題要求我們從乙個找出乘積最大的連續子串行(該序列至少包含乙個數)

首先,必須要滿足的條件是連續,那麼相比較我們之前做的最大子串行和來說,本題存在的乙個難點就是:乙個最大的乘積的連續序列乘以乙個負數後,就會變成最小的,同樣,本來是最小的乘積的連續序列乘以乙個負數後,有可能會變成最大的,如果參照最大子串行和一樣只設定乙個dp陣列,dp[i]用來表示包含第i個元素的前i個元素的乘積最大的連續子串行,那麼顯然不好寫出狀態轉移方程,具體思路如下:

所以我們還需要再增加乙個維度,用來表示前i個元素的乘積最小的連續子串行,那麼此時我們便有兩個維度,乙個是maxdp,表示當前乘積最大的連續子串行(包含第i個元素),乙個是mindp,表示當前乘積最小的連續子串行(包含第i個元素)對於當前的maxdp[i],有三種情況:(1)maxdp[i]=maxdp[i-1]*nums[i](2)maxdp[i]=nums[i](當maxdp[i-1]和min[i-1]都為負數且nums[i]為正數 或者maxdp[i-1]和mindp[i-1]都為正數且nums[i]為負數)(3)maxdp[i]=nums[i]*min[i-1](nums[i]為負數且maxdp[i-1]為負數),所以狀態轉移方程為:maxdp[i]=max(maxdp[i-1]*nums[i],nums[i],nums[i]*mindp[i-1])同理mindp[i]=min(mindp[i-1]*nums[i],nums[i],maxdp[i-1]*nums[i])因為maxdp和mindp都是關於i和i-1之間的關係,所以我們可以使用兩個變數max和min代替dp陣列

class solution 

return res;

}};

乘積最大子串行

比如,序列 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 不是子陣列。由於存在負數,那麼最大的數可能變最小的數,最小的...