我有一个N号的数组。我想将数组元素乘以以下规则;
arr[n]={5,7,2,3,4....}
the first row:A[0]*A[2]*A[3]*A[4]....*A[n]
the second row:A[0]*A[1]*A[3]*A[4]....*A[n]
the third row:A[0]*A[1]*A[2]*A[4]...*A[n]
...........
the n row:A[0]*A[1]*A[2]*A[3]*A[4]....*A[n-1]
我用O(n ^ 2)做了但是我无法解决它O(n)如果没有除法行元素我怎么能这样做呢?
答案 0 :(得分:5)
假设数组中没有零,可能的方法可能是
product = A[0]*...*A[n]
first = product / A[1]
second = product / A[2]
....
如果不允许分割,您可以使用左右运行的产品并执行以下操作:
int P[N], Q[N];
P[0] = A[0];
for(int i = 1; i < N; ++i)
P[i] = P[i - 1] * A[i];
Q[N-1] = A[N-1];
for(int i = N-2; i >= 0; --i)
Q[i] = Q[i+1] * A[i];
for(int i = 1; ....)
R[i] = P[i-1] * Q[i+1];
答案 1 :(得分:2)
假设我们没有溢出并且没有零。
std::array<int, n> arr = {5, 7, 2, 3, 4, ...};
int total = 1;
for (int v : arr)
total *= v;
for (int & v : arr)
v = total / v;
答案 2 :(得分:2)
你有两个依靠数学技巧的答案。
我会专注于实际需要的工作。看一下第一次和第二次计算。你计算了大约2n个产品。但是看看你正在成倍增加的数字:这两个计算有很多共同之处。应该很明显如何仅使用约n种产品来计算两者。
一旦你有了这个想法,你应该能够用大约3n次乘法计算你想要的所有结果,而不需要任何除法。我会把你的计算写得有些不同:
For the first row: (A[0]) * (A[2]*A[3]*A[4]....*A[n])
For the second row:(A[0]*A[1]) * (A[3]*A[4]....*A[n])
For the third row: (A[0]*A[1]*A[2]) * (A[4]...*A[n])
如何计算进行n次乘法的所有左括号?你如何计算所有正确的括号进行n次乘法?