题目:
给定一个数组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的每一个位置上的数都要遍历整个A数组,时间复杂度为n方,当数组长度非常大时,效率很低
假设A = [A0,A1,A2,A3]
B0=1,A1,A2,A3的乘积
B1=A0,1,A2,A3的乘积
B2=A0,A1,1,A3的乘积
B3=A0,A1,A2,1的乘积
B可以分解乘左边和右边的乘积,左边设为C,右边设为D
左边:
C0=1
C1=A0=1*A0=C0*A0
C2=A0*A1=C1*A1
C3=A0*A1*A2=C2*A2
所以Ci=C[i-1]*A[i-1]
把左边的值算出来先放到B中,再算右边的值,然后左边和右边相乘就是B的值
右边:
D3=1
D2=A3=1*A3=A3*D3
D1=A2*A3=A2*D2
D0=A1*A2*A3=A1*D1
Di=A(i+1)*D(i+1)
代码:
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int len = A.length;
int[] B = new int[len];
//计算左边
B[0] = 1;
for(int i = 1; i< len; i++) {
B[i] = B[i-1] * A[i-1];
}
//计算右边
int temp = 1;
for(int j = len-2; j>=0; j--) {
temp = temp * A[j+1];
B[j] = B[j]*temp;//左边和右边乘起来
}
return B;
}
}