题目:
给定一个数组 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] 。不能使用除法。
给定一个数组 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);
改进思路:
将计算过程画出来,寻找规律
如上图所示,每行跳过红色数字,黑色数字的乘积就是对应的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)。
一下是Java实现代码:
public class Interview52 {
public static void main(String[] args) {
int[] A = {1,2,3,4,5};
int[] b = multiply(A);
for (int i = 0; i < b.length; i++)
System.out.println(b[i]);
}
public static int[] multiply(int[] A) {
if (A == null || A.length <= 0) {
return null;
}
int[] c = new int[A.length];
int[] d = new int[A.length];
int[] b = new int[A.length];
d[0] = 1; // 计算D
for (int i = 1; i < A.length; i++) {
d[i] = d[i-1] * A[i-1];
}
c[A.length-1] = 1; // 计算C
for (int j = A.length-1; j > 0; j--) {
c[j-1] = c[j] * A[j];
}
// 计算B
for (int i = 0; i < A.length; i++) {
b[i] = d[i]*c[i];
}
return b;
}
}
参考文章:http://blog.csdn.net/quzhongxin/article/details/47183965