题目描述
给定一个数组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],每一次计算都要将A中除第 i 个元素外的所有元素相乘,O(n),则总的时间复杂度为O(n^2);
O(n2)
一般都不是最优算法复杂度。
改进思路:
将计算过程画出来,寻找规律
如上图所示,每行跳过红色数字,黑色数字的乘积就是对应的B[i].那么以红色数字为分割线,左侧数组设为D,右侧设为C,则B= C*D;
则
D[0] = 1; D[i] = D[i-1] * A[i-1]; 从上到下计算
C[len-1] = 1; C[i-1] = C[i] * A[i]; 从下到上计算
最后的 B[i] = D[i]*C[i];
时间复杂度O(n),空间复杂度O(n)
package niuke.easy;
public class Multiply {
public static void main(String[] args) {
}
public int[] multiply(int[] A) {
if (A == null || A.length == 0)
return null;
int[] B = new int[A.length];
int[] D = new int[A.length];
int[] C = new int[A.length];
D[0] = 1;
C[A.length - 1] = 1;
// 计算D
for (int i = 1; i < A.length; i++) {
D[i] = D[i - 1] * A[i - 1];
}
// 计算C
for (int i = A.length - 1; i > 0; i--) {
C[i - 1] = C[i] * A[i];
}
for (int i = 0; i < A.length; i++) {
B[i] = D[i] * C[i];
}
return B;
}
}