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 }
            
 
作者:shareidea            
 
出处:https://www.cnblogs.com/shareidea94/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。   
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号