面试题:构建乘积数组
题目:
给定一个数组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]
不能使用除法
思路:
一、暴力解法的时间复杂度为O(n²)
二、
B[i] = A[0]×A[1]×……×A[i-1]×A[i+1]×……×A[n-1]可分为 A[0]×A[1]×……×A[i-1]和A[i+1]×……×A[n-1]两个部分的乘积
即B[i] = 【A[0]×A[1]×……×A[i-1]】 × 【A[i+1]×……×A[n-1]】
设C[i] = A[0]×A[1]×……×A[i-1]、D[i] = A[i+1]×……×A[n-1]
可知C和D可自下而上计算,避免了重复的计算——C[i] = C[i-1]×A[i-1] D[i] = D[i+1]×A[i+1]
扫描二维码关注公众号,回复:
6533453 查看本文章
分别存储C和D,在计算B时,只需要将对应的C和D相乘
代码:
public class Q66 {
public static void main(String[] args) {
int[] A = new int[] {1,2,3,4,5};
int[] B = multipy(A);
if(B!=null) {
for(int i=0;i<B.length;i++) {
System.out.println(B[i]);
}
}
}
public static int[] multipy(int[] A) {
if(A.length!=0) {
int[] B = new int[A.length];
int[] C = new int[A.length];
int[] D = new int[A.length];
C[0] = 1;
for(int i=1;i<A.length;i++) {
C[i] = C[i-1]*A[i-1];
}
D[A.length-1] = 1;
for(int i=A.length-2;i>=0;i--) {
D[i] = D[i+1] * A[i+1];
}
for(int i=0;i<A.length;i++) {
B[i] = C[i] * D[i];
}
return B;
}else {
return null;
}
}
}