問題描述:
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位有符號整數的範圍。...