面试题:叠乘法

给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度

问题:
给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组。

我们可以把所有可能的(N-1)个数的组合找出来,分别计算它们的乘积,并比较大小。由于总共有N个(N-1)个数的组合,总的时间复杂度为O(N2),显然这不是最好的解法。
  OK,以下解答来自编程之美
解法1

解法一:
采用空间换时间的策略,用两个数组分别记录原整数数组前缀与后缀的叠乘积(前缀s[i]=),再以间隔1个数的方式将这两个数组乘起来就得到所有n-1个数的乘积数组(具体看代码)。
[cpp]
#include <iostream> 
#include <algorithm> 
using namespace std; 
 
#define MAXN 1003 
long long A[MAXN]; 
 
long long s[MAXN]; 
long long t[MAXN]; 
 
int main() 

    int n, i; 
    cin >> n; 
    for (i=1; i<=n; i++) 
        cin >> A[i]; 
    // 从前往后用叠乘法 
    s[0] = 1; 
    for (i=1; i<n; i++) 
        s[i]=A[i]*s[i-1]; 
    // 从后往前用叠乘法 
    t[n+1] = 1; 
    for (i=n; i>1; i--) 
        t[i]=A[i]*t[i+1]; 
    // 计算出n-1个n-1数连乘 
    for (i=0; i<=n-1; i++) 
        s[i] = s[i]*t[i+2]; 
    long long maximum = s[0]; 
    // 获取其中的最大值 
    for (i=1; i<=n-1; i++) 
        maximum = max(maximum, s[i]); 
    cout << maximum << endl; 

posted @ 2013-08-01 09:42  simon1024  阅读(313)  评论(0)    收藏  举报