问题描述:
给定一个数组 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]。不能使用除法。
示例:
输入: [1,2,3,4,5]
输出: [120,60,40,30,24]
提示:
- 所有元素乘积之和不会溢出 32 位整数
- a.length <= 100000
解题思路:
双层循环的暴力法会超时,就不说了。我们可以列出n行的数组a,将看到一个矩阵,我们需要求的就是每一行的乘积;不过这个矩阵的对角线必须都为1。
这样就出现了两个三角形,上三角和下三角。我们可以先求下三角的值,然后再将上三角的值乘进来。
代码实现:
public int[] constructArr2(int[] a) {
if(a.length == 0) return new int[0];
int[] b = new int[a.length];
b[0] = 1;
int tmp = 1;
//本次循环后,b[i]表示a[0]到a[i-1]的乘积,即计算出下三角的乘积
for(int i = 1; i < a.length; i++) {
b[i] = b[i - 1] * a[i - 1]; //只乘到i-1,第i个值是不能乘的。
}
//计算出上三角的乘积,
for(int i = a.length - 2; i >= 0; i--) {
//之所以从length-2开始是因为b[length-1]不能乘以a[length-1]
tmp *= a[i + 1]; //这里i+1也是因为b[i]不能乘以a[i]
b[i] *= tmp;
}
return b;
}
提交结果: