剑指offer第二版——面试题66(java)

面试题:构建乘积数组

题目:

给定一个数组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;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_22527013/article/details/91415458