タイトル:所与のアレイA [0,1、...、N- 1]、 配列B構築してください[0,1、...を、N- 1]、 Bが要素B [I] = Aであり、ここで、[0 ] [1] ... A * [1-I] A [I + 1] ... * A [N - 1]。あなたは分裂を使用することはできません。
アイデア:
安全思考を証明するために、B [I]の値は、図の行列の各列の積と考えることができます。乗法容量の下の三角を得ることができ、ボトムアップからのトライアングルは、乗算絶えずあります。私たちの思考が偶数の最初のカウント、下の三角形で、非常に明確であるので、我々は最初の[i]はBの一部を計算して、三角形の分布によって反転し、も考慮に他の部分を取ります。
public int[] multiply (int []A) {
int length = A.length;
int[] B = new int[length];
if (length != 0) {
B[0] = 1 ;
//计算下三角连乘
for (int i = 0; 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;
}