构建乘积数组
题目描述
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。
方法一
阶乘即可,但是时间复杂度高.
public int[] multiply(int[] A) {
int[] b = new int[A.length];
if(A == null || A.length == 0) {
return b;
}
for (int i = 0; i < b.length; i++) {
b[i] = Factorial(A, 0, i - 1) * Factorial(A, i + 1, b.length - 1);
}
return b;
}
public int Factorial(int[] elem, int low, int high) {
int temp = 1;
for (int i = low; i <= high; i++) {
temp *= elem[i];
}
return temp;
}
方法二
下三角用连乘可以很容求得,上三角,从下向上也是连乘。
定义C[i]=A[0] * A[1] * …* A[n - 1],D[i] = A[i + 1] * A[i + 2] * … * A[n - 1]。
那么C[i]可以用自上而下的顺序计算出来,即C[i] = C[i - 1] * A[i - 1]。同样D[i]可以自下而上的顺序计算出来,即D[i] = D[i + 1] * A[i + 1]。
因此思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。
public int[] multiply_2(int[] A) {
int length = A.length;
int[] b = new int[length];
if(length != 0) {
b[0] = 1;
for (int i = 1; i < length; i++) {
b[i] = b[i - 1] * A[i - 1];
}
int temp = 1;
for (int i = length - 2; i >= 0; i--) {
temp *= A[i + 1];
b[i] *= temp;
}
}
return b;
}