给定一个数组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]取1 result[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; } }
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8