• 一、题目
  • 二、解题思路
  • 三、解题代码

    一、题目

    给定一个数组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. }