题解 | #构建乘积数组#
构建乘积数组
http://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46
最容易想到的就是暴力法,依次求出每个B[i],但是这样的时间复杂度为O(n^2),效率太低了。既然暴力法效率太低,那就看看能不能找出B[i]之间的关系来提高效率。import java.util.ArrayList; public class Solution { public int[] multiply(int[] A) { if(A == null)return null; int length = A.length; if(length == 0 || length == 1)return new int[0]; int[] B = new int[length]; B[0] = 1; for(int i = 1;i < length;i++){ B[i] = B[i - 1] * A[i - 1]; } int temp = 1; for(int i = length - 2;i >= 0;i--){ temp *= A[i + 1]; B[i] *= temp; } return B; } }由上图可以发现
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]。数组间的关系通过画图更容易找出关系