构建乘积数组:

构建左右乘积表:

  • 左乘积表表示A中位置i以前的所有元素乘积。对于i=0,由于左侧无元素,设为1
  • 右乘积表表示A中位置i以后的所有元素乘积。对于i=n-1,由于左侧无元素,设为1

最终结果为左右乘积表对应位置相乘即可

    public int[] multiply(int[] A) {
        if (A == null || A.length <= 1) {
            return null;
        }
        int n = A.length;
        int[] B1 = new int[n];
        B1[0] = 1;
        for (int i = 1; i < n; i++) {
            B1[i] = B1[i - 1] * A[i - 1];
        }
        int[] B2 = new int[n];
        B2[n - 1] = 1;
        for (int i = n - 2; i >= 0; i--) {
            B2[i] = A[i + 1] * B2[i + 1];
        }
        int[] B = new int[n];
        for (int i = 0; i < n; i++) {
            B[i] = B1[i] * B2[i];
        }
        return B;
    }