构建乘积数组

题目描述
给定一个数组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 int[] multiply(int[] A) {
		int[] b = new int[A.length];
		if(A == null || A.length == 0) {
			return b;
		}
		
		for (int i = 0; i < b.length; i++) {
			b[i] = Factorial(A, 0, i - 1) * Factorial(A, i + 1, b.length - 1);
		}
		return b;
	}
	
	public int Factorial(int[] elem, int low, int high) {
		int temp = 1;
		for (int i = low; i <= high; i++) {
			temp *= elem[i];
		}
		return temp;
	}

方法二
在这里插入图片描述
下三角用连乘可以很容求得,上三角,从下向上也是连乘。

定义C[i]=A[0] * A[1] * …* A[n - 1],D[i] = A[i + 1] * A[i + 2] * … * A[n - 1]。
那么C[i]可以用自上而下的顺序计算出来,即C[i] = C[i - 1] * A[i - 1]。同样D[i]可以自下而上的顺序计算出来,即D[i] = D[i + 1] * A[i + 1]。

因此思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。

	public int[] multiply_2(int[] A) {
		int length = A.length;
		int[] b = new int[length];
		if(length != 0) {
			b[0] = 1;
			for (int i = 1; i < length; i++) {
				b[i] = b[i - 1] * A[i - 1];
			}
			int temp = 1;
			for (int i = length - 2; i >= 0; i--) {
				temp *= A[i + 1];
				b[i] *= temp;
			}
		}
		return b;
	}
原文地址:https://www.cnblogs.com/lishanlei/p/10707655.html