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

标签 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) 算法?

我试了好几种方法,还是不行。有什么想法吗?

最佳答案

首先,计算所有的左乘和右乘:

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 数组可以在线性时间内计算。类似地,正确的数组可以在线性时间内计算。

leftright,数组b可以在线性时间内通过b[i] = left[i -1] * right[i+1] 具有 i == 0i == n 的特殊情况。

关于algorithm - 获取 O(N) 算法以找到具有奇怪约束的数字集合的乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16466379/

相关文章:

python - 计算 Levenshtein Edit Distance 的复杂度

java - 查找 1 个字符串中的每个字符是否存在于另一个字符串中,比 O(n^2) 更快

algorithm - 分区问题蛮力算法

algorithm - 带 lg(n) 证明的简单大 O

algorithm - 在第三个列表中存在的两个python列表中找到公共(public)索引

algorithm - 如何在 O(n) 时间内对单链表进行二分查找?

c++ - 减少通过 UDP 套接字发送的数据

c++ - 这个用于计算 a^n 的算法是如何被重写为在 O(log n) 时间内运行的?

algorithm - 此代码片段的时间复杂度

algorithm - 无等待算法正确性证明的一般方法