動態規劃 最大乘積子串

2021-08-18 04:15:33 字數 1088 閱讀 9229

給定乙個陣列,求其中乘積最大的子串的乘積。如陣列[2,3,-2,4],最大乘積為2*3=6.

分析:最簡單的方法是設定乙個二維陣列p[i][j]表示從 i 到 j 這個子串的乘積,然後求p中的最大值。但這種方法時間複雜度和空間複雜度都比較高。

計算子串的乘積,如果中間包含了0,那麼整個子串的乘積就是0。因此,需要以0為分界點,把陣列分成幾個子串,再分別求最大乘積。計算子串的最大乘積的方法有以下幾種方法:

方法一:因為陣列中都是整數,所以子串越長,絕對值越大,因此可以先計算子串中負數的總數,如果總數為偶數,那麼所有元素的乘積是最大的正數;如果負數的總數為奇數,使p1 = 從第乙個到最後乙個負數之前元素的乘積, p2 = 第乙個負數後的元素開始到最後乙個元素的乘積,p1和p2之間的最大值就是這個子串的最大值。

public int maxproduct(int nums) 

if(zeros.size() == 2)

return product(nums, 0, nums.length - 1); //沒有0

listproducts = new arraylist();

for(int i = 0; i < zeros.size() - 1; i++)

int max = integer.min_value;

for(int p : products)

if(p > max)

max = p;

return math.max(max, 0);

}public int product(int nums, int start, int end)

}if(count % 2 == 0)

return max;

} else

}

方法二:維持兩個變數:最大值和最小值,如果乘以乙個負數,最大值將會變成最小值,最小值變成最大值。對於每乙個元素,其之前的子串的最大值和最小值要麼是其自身,要麼是之前的最大值、最小值乘以該元素。public int maxproduct(int nums) {

int max = integer.min_value, imax = 1, imin = 1;

for(int i=0; i

最大乘積連續子串

輸入一組浮點數,求出這個浮點陣列最大乘積的連續子串。舉個例子,浮點陣列為str 這時得出來的結果是前兩個浮點數的乘積,即15。需要注意的是,這個子串是要求連續的,另外,子串的長度可以為1.這裡給出兩種思路,後續可能還會加入新的思路。第一種是直接求解。即用雙層迴圈。外面一層是從1到浮點陣列的長度,裡面...

23最大乘積子串

題目描述 給乙個浮點數序列,取最大乘積連續子串的值,例如 2.5,4,0,3,0.5,8,1,則取出的最大乘積連續子串為3,0.5,8。也就是說,上述陣列中,3 0.5 8這3個數的乘積3 0.5 8 12是最大的,而且是連續的。提醒 子串子串行不同,子串要求連續,子串行不要求連續。分析 這個問題與...

最大乘積子陣列

程式設計之美 上有一道關於在長度為n的陣列中找到n 1個元素乘積最大的題目,不過這並不是本文要討論的。本文討論的是另一種情況,給定乙個長度為n的浮點陣列,找乙個長度任意的子陣列 子陣列的元素在原陣列中是連續存放的 這個子陣列的乘積最大。通常,找乙個滿足指定條件子陣列都會使用動態規劃。遞迴縮小問題規模...