[Java]剑指offer:构建乘积数组

题目描述

给定一个数组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[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)
 
思路
 
      最容易想到的就是暴力法,依次求出每个B[i],但是这样的时间复杂度为O(n^2),效率太低了。
      既然暴力法效率太低,那就看看能不能找出B[i]之间的关系来提高效率。
 
        

 

由上图可以发现

B[i]的左半部分(红色部分)和B[i-1]有关,将红色部分乘积和看成C[i],则有C[i] = C[i-1]*A[i-1]
B[i]的右半部分(紫色部分)和B[i+1]有关,可以使用一个temp代表B[i]的右半部分,每次temp*A[i+1]
 
因此我们可以先从0遍历到n-1,计算出B[i]的左半部分。然后将左半部分与代表其有半部分的temp相乘,即可得到B[i]。
 1 import java.util.ArrayList;
 2 public class Solution {
 3     public int[] multiply(int[] A) {
 4         
 5         if(A.length==0||A.length<2){
 6             return null;
 7         }
 8         
 9         int[] B = new int[A.length];
10         B[0] = 1;
11         for(int i=1;i<B.length;i++){
12             B[i] = B[i-1]*A[i-1];
13         }
14         int temp = 1;
15         for(int i = A.length-2;i>=0;i--){
16             temp *= A[i+1];
17             B[i] *= temp;
18         }
19      
20         return B;
21     }
22 }

 

总结

数组间的关系通过画图更容易找出关系

 

 

posted @ 2020-07-23 22:17  DXYE  阅读(128)  评论(0编辑  收藏  举报