[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 }
总结
数组间的关系通过画图更容易找出关系