题目:给定一个数组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)。
package jianZhiOffer;
/*
* 面试题66:构建乘积数组
* 题目:给定一个数组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 class Demo66 {
public static void main(String[] args) {
int[] A= {1,2,3,4,5};
int[] B = multiply(A);
for(int i=0;i<B.length;i++)
System.out.println(B[i]);
}
public static int[] multiply(int[] A) {
if(A==null || A.length<=0)
return null;
int[] c = new int[A.length];
int[] d = new int[A.length];
int[] b = new int[A.length];
d[0]=1; //计算D
for(int i=1;i<A.length;i++) {
d[i] = d[i-1]*A[i-1];
}
c[A.length-1] = 1; //计算C
for(int j=A.length-1;j>0;j--) {
c[j-1] = c[j]*A[j];
}
//计算B
for(int i=0;i<A.length;i++) {
b[i] = d[i]*c[i];
}
return b;
}
}