题目描述
给定一个数组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]。不能使用除法。
解题思路:
将计算过程画出来,寻找规律
如上图所示,每行跳过红色数字,黑色数字的乘积就是对应的B[i].那么以红色数字为分割线,左侧数组设为D,右侧设为C,则B= C*D;
则
D[0] = 1; D[i] = D[i-1] * A[i-1]; 从上到下计算
C[len-1] = 1; C[i-1] = C[i] * A[i]; 从下到上计算
最后的 B[i] = D[i]*C[i];
时间复杂度O(n),空间复杂度O(n)。
代码如下:
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
if(A==null||A.length<=0){
return null;
}
int[] d=new int[A.length];
int[] c=new int[A.length];
int[] b=new int[A.length];
d[0]=1;
for(int i=1;i<A.length;i++){
d[i]=d[i-1]*A[i-1];
}
c[A.length-1]=1;
for(int j=A.length-1;j>0;j--){
c[j-1]=c[j]*A[j];
}
for(int i=0;i<A.length;i++){
b[i]=d[i]*c[i];
}
return b;
}
}