1. 程式人生 > 實用技巧 >劍指offer(52):構建乘積陣列

劍指offer(52):構建乘積陣列

題目描述

給定一個數組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];) 對於A長度為1的情況,B無意義,故而無法構建,因此該情況不會存在。 我的思路:

下三角,用連乘,下三角用for迴圈

但是這樣時間複雜度仍然是O(n^2)

class Solution {
public:
    vector<int
> multiply(const vector<int>& A) { vector<int> B; int len = A.size(); int frontMul = 1; int backMul = 1; for(int i=0;i<len;i++){ if(i>0) frontMul *= A[i-1]; backMul = 1; for(int j = i+1
;j<len;j++){ backMul *= A[j]; } B.push_back(frontMul*backMul); } return B; } };

時間複雜度為O(n)的思路:

C[i]可以用自上而下的順序計算出來,C[i]=C[i-1]*A[i-1]

D[i]可以使用自下而上的順序計算出來,D[i]=D[i+1]*A[i+1]

然後返回的結果B[i]=C[i] * D[i]

import java.util.ArrayList;
public class
Solution { public int[] multiply(int[] A) { int len = A.length; int[] B = new int[len]; int[] C = new int[len]; int[] D = new int[len]; C[0] = 1; D[len-1]=1; for(int i=1;i<len;i++){ C[i] = C[i-1] * A[i-1]; } for(int i=len-2;i>=0;i--){ D[i] = D[i+1] * A[i+1]; } for(int i=0;i<len;i++){ B[i] = C[i] * D[i]; } return B; } }