题目
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+ 1]×…×A[n-1]。不能使用除法。
思路
本题难点在于不能使用除法,即只用乘法 生成数组B
数组B
的定义是,B[i]
的值为数组A
中除了A[i]
之外所有元素的乘积值
根据表格的主对角线(全为 1
),可将表格分为 上三角 和 下三角 两部分。分别迭代计算下三角和上三角两部分的乘积,即可 不使用除法 就获得结果。
算法流程:
(1)初始化:数组 B
,其中 B[0]=1
;辅助变量 tmp=1
;
(2)计算 B[i]
的 下三角 各元素的乘积,直接乘入 B[i]
;
(3)计算 B[i]
的 上三角 各元素的乘积,记为 tmp,并乘入 B[i]
;
(4)返回 B
。
流程图如下:
java代码如下:
class Solution{
public int[] constructArr(int[] a){
int len = a.length;
if (len == 0) {
return new int[0];
}
int[] b = new int[len];
b[0] = 1;
int tmp = 1;
for(int i = 1; i < len; i++){
b[i] = b[i-1] * a[i-1];//从第一行到最后一行逐行计算下三角每行的b[i]的值,此时的b[i]值是不完全的值,因为还没有和上三角的值相乘
}
for(int i = len - 2; i >= 0; i--){//注意起始索引为len-2,在图中可以看出
tmp *= a[i+1];//从下往上计算每行的乘积值并存储下来
b[i] *= tmp;//将存储的值和前面计算的下三角的每行的b[i]值相乘
}
return b;
}
}