少乙個數的子串行的最大乘積

2021-06-08 07:04:22 字數 1397 閱讀 5981

問題描述:

n個數組成的乙個序列,求任意(n - 1)個數的組合中乘積最大的一組,規定不能用除法。這個問題來自《程式設計之美》。

這n個數存於陣列a[0..n-1]中。

1 解法一

設s[i]為陣列a中前i個數的乘積,即

s[i] = 1                  i = 0時,

s[i] = s[i - 1] * a[i]  i = 1,2,...,n

設t[i]為陣列a中後 n-i 個數的乘積,即

t[i] = 1                   i = n時,

t[i] = t[i + 1] * a[i]   i = n-1,n-2,...,0

設p[i]為處a[i]元素外,其餘 n-1 個元素的乘積,則

p[i] = s[i] * t[i + 1]   i = 0,1,...,n-1

由此可得出下面的演算法實現:

int maxproduct(int a, int n)

總的時間複雜度為o(n),演算法有很多不足,比如計算了很多此乘法,計算機需要花大量的時間去作乘法操作。

2 解法二

設p為a中n個數的乘積,a(n-1)表示n-1個數的組合,p(n-1)表示n-1個數組合的乘積。對p的正負性進行分析:

(1) p = 0。則這n個數中至少有乙個數為0,除去這個0,設其餘n-1個數的乘積為q,若:

(a) q = 0            return 0

(b) q > 0            return q

(c) q < 0            return 0

(2) p < 0。去掉乙個負數,這個負數是陣列a中所有負數之中最大的(絕對值最小的),其餘n-1個數的乘積就是所求。

(3) p > 0。則:

(a) 若陣列中有正數,則去掉陣列中所有正數之中最小的乙個,其餘n-1個數的乘積即是所求。

(b) 若陣列中無正數,去掉陣列中最小的負數(絕對值最大的),其餘n-1個數的乘積即是所求。

其實不需要求出p的值,而只需要統計陣列a中正數、負數、零的個數即可分析問題了。

演算法如下:

int improvedmaxproduct(int a, int n)

//之後是陣列中沒有零的情況

if (nagative % 2 == 1)

return k;

} //if

//p > 0

if (positive > 0)

return k;

} else

return k;

}}

返回值更改了,當最大乘積是0時,函式返回-1;否則返回去掉的那個數在陣列a中的下標。

三個數的最大乘積

給定乙個整型陣列,在陣列中找出由三個數組成的最大乘積,並輸出這個乘積。leetcode鏈結 示例 1 輸入 1,2,3 輸出 6示例 2 輸入 1,2,3,4 輸出 24注意 給定的整型陣列長度範圍是 3,104 陣列中所有的元素範圍是 1000,1000 輸入的陣列中任意三個數的乘積不會超出32位...

三個數的最大乘積

給定乙個整型陣列,在陣列中找出由三個數組成的最大乘積,並輸出這個乘積。示例 1 輸入 1,2,3 輸出 6 示例 2 輸入 10,2,3,5,4 輸出 100 注意 給定的整型陣列長度範圍是 3,104 陣列中所有的元素範圍是 1000,1000 輸入的陣列中任意三個數的乘積不會超出32位有符號整數...

三個數的最大乘積

給定乙個整型陣列,在陣列中找出由三個數組成的最大乘積,並輸出這個乘積。示例 1 輸入 1,2,3 輸出 6 示例 2 輸入 1,2,3,4 輸出 24 注意 給定的整型陣列長度範圍是 3,104 陣列中所有的元素範圍是 1000,1000 輸入的陣列中任意三個數的乘積不會超出32位有符號整數的範圍。...