写在前面:
这道题,我们首先要掌握乘积的规律
(1)B[0] = A[1] * A[2] * A[3] * A[4] *....*A[n-1] ;(没有A[0])
(2)B[1] = A[0] * A[2] * A[3] * A[4] *....*A[n-1] ;(没有A[1])
(3)B[2] = A[0] * A[1] * A[3] * A[4] *....*A[n-1] ;(没有A[2])
也就是说,B[i]=数组A所有项的乘积,除了A[i]
这样,我们就可以构造出一个矩阵,由上三角和下三角组成。先计算出下三角的乘积,再计算上三角的乘积,即为B数组每个元素的值。
搜索:
B[0] | 1 | A[1] | A[2] | 。。。 | A[n-2] | A[n-1] |
B[1] | A[0] | 1 | A[2] | 。。。 | A[n-2] | A[n-1] |
B[2] | A[0] | 。。。 | 1 | 。。。 | A[n-2] | A[n-1] |
。。。 | A[0] | A[1] | 。。。 | 1 | A[n-2] | A[n-1] |
B[n-2] | A[0] | A[1] | A[2] | A[n-3] | 1 | A[n-1] |
B[n-1] | A[0] | A[1] | A[2] | A[n-3] | A[n-2] | 1 |
代码实现如下:
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; j >= 0; j--) {
temp = temp * A[j + 1];
B[j] = temp * B[j];
}
}
return B;
}