/*
* 面试题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]。
* 不能使用除法。
* 思路:以i为界限分为两部分来计算,使用矩阵法求解,将矩阵分为上三角矩阵和下三角矩阵,分别求乘积
* B0 1 A1 A2 ... An-2 An-1 *
* B1 A0 1 A2 ... An-2 An-1 *
* B2 A0 A1 1 ... An-2 An-1 *
* ... A0 A1 ... 1 An-2 An-1 *
* Bn-2 A0 A1 ... An-3 1 An-1 *
* Bn-1 A0 A1 ... An-3 An-2 1
*/
public class No66multiply {
public static void main(String[] args) {
No66multiply n = new No66multiply();
int[] A = {1,1,2,3,4,5,6};
int[] B = n.multiply(A);
for (int i = 0; i < B.length ; i++) {
System.out.print(B[i] + ",");
}
}
public int[] multiply(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 j = length - 2; j >= 0; j--) {
temp *= A[j+1];
B[j] *= temp;
}
}
return B;
}
}