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

三、解题代码
public class Test{public static double[] multiply(double[] data) {if (data == null || data.length < 2) {return null;}double[] result = new double[data.length];// result[0]取1result[0] = 1;for (int i = 1; i < data.length; i++) {// 第一步每个result[i]都等于于data[0]*data[1]...data[i-1]// 当i=n-1时,此时result[n-1]的结果已经计算出来了result[i] = result[i -1] * data[i - 1];}// tmp保存data[n-1]*data[n-2]...data[i+1]的结果double tmp = 1;// 第二步求data[n-1]*data[n-2]...data[i+1]// result[n-1]的结果已经计算出来,所以从data.length-2开始操作for (int i = data.length - 2; i >= 0; i--) {tmp *= data[i + 1];result[i] *= tmp;}return result;}}
