title: '算法:构建乘积数组' cover: https://img.paulzzh.com/touhou/random?54 categories: 算法题目 date: 1996-07-27 08:00:00 tags: [算法题目, 数组, 数学]
<br/>
<!--more-->给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]xA[1]x...xA[i-1]xA[i+1]x...xA[n-1]。
不能使用除法。
(注意:规定B[0] = A[1] x A[2] x ... x A[n-1],B[n-1] = A[0] x A[1] x ... x A[n-2];)
剑指的思路:
B[i]的值可以看作下图的矩阵中每行的乘积。
下三角用连乘可以很容求得,上三角,从下向上也是连乘。
因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] arr) {
if (arr == null) return new int[0];
int len = arr.length;
if (len <= 1) return new int[1];
int[] res = new int[len];
// 计算下三角
res[0] = 1;
for (int i = 1; i < len; ++i) {
res[i] = res[i - 1] * arr[i - 1];
}
// 计算上三角
int temp = 1;
for (int i = len - 2; i >= 0; --i) {
temp *= arr[i + 1];
res[i] *= temp;
}
return res;
}
}