51 构建成乘积数组

题目要求:给定一个数组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]。不能使用除法。

 

一个直观的解法是用连乘n-1个数字得到B[i].显然这个方法需要O(n*n)的时间构造整个数组B.

好在还有更高效的算法。可以把B[i]=A[0]*A[1]*.....*A[i-1]*A[i+1]*.....*A[n-1].
看成   A[0]*A[1]*.....*A[i-1]   和   A[i+1]*.....A[n-2]*A[n-1]   两部分的乘积。
因此,数组B可以用一个矩阵来创建。在图中,B[i]为矩阵中第i行所有元素的乘积.
 

 

 下面这个图可以帮助你理解,来自于https://blog.csdn.net/qq_28081081/article/details/80875917

 

 1 public class Solution {
 2     public int[] multiply(int[] A){
 3         int[] B = new int[A.length];
 4         int[] C = new int[A.length];
 5         int n = A.length;
 6         //最左上角和最右下角元素,先赋值为1.1乘任何数都等于该数
 7         B[0] = 1;  C[n-1] = 1;
 8         for(int i=1;i<A.length;i++){
 9             //依次计算下三角的元素,一定要结合图片理解
10             B[i] = B[i-1]*A[i-1];
11             //依次计算上三角的元素,一定要结合图片理解
12             //这一步太考验数学了,想起了被考研高数支配的恐惧
13             C[n-1-i] = C[n-i]*A[n-i];
14         }
15         for(int i=0;i<n;i++){
16             B[i] =C[i]*B[i];
17         }
18         return B;
19     }
20 }

 

posted @ 2019-07-24 13:45  淡如水94  阅读(140)  评论(0)    收藏  举报