获取O(N)算法以查找具有奇怪约束的数字集合的乘积

时间:2013-05-09 16:16:42

标签: algorithm complexity-theory big-o

这是我参加最近一次采访时的一个问题,我觉得很有意思。假设int n = 10;

输入:数组int a[10];

输出:数组float b[10];

要求:

b[0]= a[1]*a[2]*...a[9];  //  product of all numbers in a, other than a[0]; 
b[1]= a[0]*a[2]*...a[9];  //  product of all numbers in a, other than a[1];
....
b[9]= a[0]*a[1]*...a[8];  //  product of all numbers in a, other than a[9];
....

问题:如何在不使用除法运算符b 的情况下使用填充数组/?并使用O(n)算法?

我尝试了很多方法,但仍然徒劳无功。有什么想法吗?

2 个答案:

答案 0 :(得分:15)

首先,计算所有左右产品:

left[i] = a[0]*a[1]*...*a[i]
right[i] = a[i]*a[i+1]*...*a[n-1]

请注意left[i] == left[i-1] * a[i],因此可以在线性时间内计算left数组。同样地,right数组可以在线性时间内计算。

leftright开始,数组b可以按b[i] = left[i-1] * right[i+1]的线性时间计算i == 0i == n的特殊情况

答案 1 :(得分:1)

根据Egor Skriptunoff的想法,我写了这段代码:它更容易理解:

        float l[n];
        float r[n];
        left[0] = 1;
        right[n-1] = 1;
        for (int i=1; i<n; i++)
        {
            l[i] = l[i-1]*a[i-1];
        }
        for (int i=n-2; i>=0; i--)
        {
            r[i] = r[i+1]*a[i+1];
        }
        for (int i=0; i<n; i++)
        {
            b[i] = l[i]*r[i];
        }