【Java】面试题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]。不能使用除法

思路:
将计算过程画出来,寻找规律

在这里插入图片描述

如上图所示,每行跳过红色数字,黑色数字的乘积就是对应的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;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_38361153/article/details/89213033