子陣列的最大乘積

2021-05-25 07:41:35 字數 2405 閱讀 8783

子陣列的最大乘積

給定乙個長度為

n的整數陣列,

只允許用乘法,

不能用除法,

計算任意

(n-1

)個數的組合乘積中最大的一組,並寫出演算法的時間複雜度。

我們把所有可能的(

n-1)個數的組合找出來,分別計算它們的乘積,並比

較大小。由於總共有n個(

n-1)個數的組合,總的時間複雜度為o(

n2 ),但顯然這不是最好的解法。

分析與解法

【解法一】

在電腦科學中,時間和空間往往是一對矛盾體,不過,這裡有乙個優化的

折中方法。可以通過「空間換時間」或「時間換空間」的策略來達到優化某一方面的

效果。在這裡,是否可以通過「空間換時間」來降低時間複雜度呢?

計算(n-1)個數的組合乘積,假設第

i 個(0≤

i≤n-1)元素被排除在乘積之

外(如圖

2-13

所示)。

圖2-13

組合示意圖 設

array

為初始陣列,

s[i]

表示陣列前

i個元素的乘積

,其中1≤i

≤n,s[0] = 1

(邊界條件),那麼

s[i]= s[i-1]

×array[i-1]

,其中i = 1, 2,

…, n-1, n;設

t[i]

表示陣列後(

n-i)個元素的乘積

,其中1≤i

≤n,t[n+1]=1

(邊界條件),那麼

t[i]=t[i+1]

×array[i]

,其中i=1, 2,

…, n-1, n;

那麼設p[i]

為陣列除第

i 個元素外,其他

n-1

個元素的乘積,即有:

p[i]=s[i-1]

×t[i+1]。

由於只需要從頭至尾,和從尾至頭掃瞄陣列兩次即可得到陣列s和

t,進而線性時間可以得到

p。所以,很容易就可以得到

p的最大值(只需遍歷p

一次)。總的時間複雜度等於計算陣列s、

t、p的時間複雜度加上查詢p

最大值的時間複雜度等於o(

n)。【解法二】

其實,還可以通過分析,進一步減少解答問題的計算量。假設

n 個整數的

乘積為p

,針對p

的正負性進行如下分析(其中,

an-1

表示n-1

個數的組合,

pn-1 表示

n-1

個數的組合的乘積):

1.p為0

那麼,陣列中至少包含有乙個

0。假設除去乙個

0之外,其他

n-1個數的乘積為q

,根據q

的正負性進行討論: q

為0 說明陣列中至少有兩個

0,那麼

n-1個數的乘積只能為

0,返回0;

q為正數 返回q

,因為如果以

0替換此時

an-1

中的任乙個數,所得到的

pn-1為0

,必然小於q;

q為負數

如果以0

替換此時

an-1

中的任乙個數,所得到的

pn-1為0

,大於q

,乘積最大值為0

。 2.p為負數

根據「負負得正」的乘法性質,自然想到從

n個整數中去掉乙個負數,使得

pn-1

為乙個正數。而要使這個正數最大,這個被去掉的負數的絕對值必須

是陣列中最小的。我們只需要掃瞄一遍陣列,把絕對值最小的負數給去掉

就可以了。

3.p為正數 類似p

為負數的情況,應該去掉乙個絕對值最小的正數值,這樣得到的

pn-1

就是最大的。

上面的解法採用了直接求

n個整數的乘積

p,進而判斷

p的正負性的辦法,

但是直接求乘積在編譯環境下往往會有溢位的危險

(這也就是本題要求不使用除

法的潛在用意

☺),事實上可做乙個小的轉變,不需要直接求乘積,而是求出數

組中正數(

+)、負數(-)和

0 的個數,從而判斷

p 的正負性,其餘部分與以

上面的解法相同。

在時間複雜度方面,由於只需要遍歷陣列一次,在遍歷陣列的同時就可得

到陣列中正數(

+)、負數(-)和

0 的個數,以及陣列中絕對值最小的正數和

負數,時間複雜度為o(

n)。

最大乘積子陣列

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

子陣列最大乘積

給定乙個double型別的陣列arr,其中的元素可正可負可0,返回子陣列累乘的最大乘積。例如arr 2.5,4,0,3,0.5,8,1 子陣列 3,0.5,8 累乘可以獲得最大的乘積12,所以返回12。解析 此題可以運用動態規劃解決 設f i 表示以i為結尾的最大值,g i 表示以i結尾的最小值,那...

子陣列最大乘積

給定乙個double型別的陣列arr,其中的元素可正可負可0,返回子陣列累乘的最大乘積。例如arr 2.5,4,0,3,0.5,8,1 子陣列 3,0.5,8 累乘可以獲得最大的乘積12,所以返回12。分析 設f i 表示以i為結尾的最大值,g i 表示以i結尾的最小值,那麼 f i 1 的最大值與...