题目要求不能用除法,所以只能用乘法,如果每一个B[i]直接乘的话会有很多重复计算,费时
所以可根据题意 可构建一个矩阵,分为上下两个三角区域
下三角区域中,b[n] = b[n-1] * a[n-1]
上三角区域中,b[n] = b[n-+] * a[n+1]
这样递推可以有效地避免重复计算
最后上三角的b[n] 乘上下三角的b[n],就得到结果
public int[] constructArr(int[] a) {
if (a.length == 0) return new int[0];
/** 先建立两个数组bBown 和 bUp 分别来存放上下两个上角的值*/
int[] bBown = new int[a.length];
int[] bUp = new int[a.length];
int[] res = new int[a.length];
/** 先算出下三角区域的值*/
bBown[0] = 1;
for (int i = 1; i <= a.length-1; i++){
bBown[i] = a[i-1] * bBown[i-1];
}
/** 再算出上三角区域的值*/
bUp[a.length-1] = 1;
res[a.length-1] = bBown[a.length-1] * bUp[a.length-1];
for (int j = a.length-2; j >= 0;j--){
bUp[j] = a[j+1] * bUp[j+1];
/** 两个三角的值相结合*/
res[j] = bUp[j] * bBown[j];
}
return res;
}