一、题目

给定一个数组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]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。

img

三、解题代码

  1. public class Test{
  2. public static double[] multiply(double[] data) {
  3. if (data == null || data.length < 2) {
  4. return null;
  5. }
  6. double[] result = new double[data.length];
  7. // result[0]取1
  8. result[0] = 1;
  9. for (int i = 1; i < data.length; i++) {
  10. // 第一步每个result[i]都等于于data[0]*data[1]...data[i-1]
  11. // 当i=n-1时,此时result[n-1]的结果已经计算出来了
  12. result[i] = result[i -1] * data[i - 1];
  13. }
  14. // tmp保存data[n-1]*data[n-2]...data[i+1]的结果
  15. double tmp = 1;
  16. // 第二步求data[n-1]*data[n-2]...data[i+1]
  17. // result[n-1]的结果已经计算出来,所以从data.length-2开始操作
  18. for (int i = data.length - 2; i >= 0; i--) {
  19. tmp *= data[i + 1];
  20. result[i] *= tmp;
  21. }
  22. return result;
  23. }
  24. }