给定一个数组 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]。要求不能使用除法。
B[i]的值可以看作下图的矩阵中每行的乘积。
下三角用连乘可以很容求得,上三角,从下向上也是连乘。
因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。
例如:A[]={1,2,3}求B[]
B[0]=A[1]×A[2]=2×3=6
B[1]=A[0]×A[2]=1×3=3
B[2]=A[0]×A[1]=1×2=2
1.B[0]初始化为1,从下标i=1开始,先求出C[i]的值并放入B[i],即 B[i]=C[i]=C[i-1]×A[i-1],所以B[1]=B[1-1]×A[1-1]=B[0]×A[0]=1×1=1,i++
2.B[2]=B[2-1]×A[2-1]=B[1]×A[1]=1×2=2,i++超出长度停止循环
3.C[i]计算完毕求D[i],设置一个临时变量temp初始化为1
4.从后往前变量数组,LengthA=3,初始化 j =A.Length-2=1,结束条件为 j >=0
5.第一次循环,temp = temp×A[i+1]=1×A[2]=3,计算出 A 中最后一个元素的值放入temp,temp 相当于 D[ i ]的值
6.因为之前的 B [ i ]=C[ i ],所以让 B[ i ]×D[ i ]就是要保存的结果,即B[j]=B[1]=B[1]×temp=1×3=3,i–=0
7.计算B[ j ]=B[ 0 ],temp 上一步中的值是A[ 2 ] ,在这次循环中temp=temp×A[0+1]=A[2]×A[1]=3×2=6
8.B[i]=B[0]=B0]×temp=1×6=6,i–<0循环结束
所以B数组为{6,3,2}
public class Solution {
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-2; j >= 0; j--){
temp *= A[j+1];
B[j] *= temp;
}
}
return B;
}
}
length -1 是最后一个,最后一个为1,temp = 1就已经是最后一个的值,那么从length - 2开始就是An-1,就如同下三角的计算是从1开始,不从0开始。