劍指OFFER_構建乘積陣列
阿新 • • 發佈:2020-07-13
劍指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];)
思路
由於不讓使用除法,我只能想到挨個相乘的笨辦法,但是這種辦法肯定會超時。我沒找到更好的辦法的情況下去看了題解:
題目把A[i]分為了左右兩個部分,left=A[0] * ……A[i-1];right=A[i+1] * …… A[n-1],如同圖中所示。
那麼就可以把藍色區域和紅色區域作為陣列計算出來,然後構建B[i]的時候將左右兩個部分相乘即可,程式碼如下:
程式碼
typedef vector<int> vec; class Solution { public: vector<int> multiply(const vector<int>& A) { int len = A.size(); vec ans = vec(len); vec front_order = vec(len); vec back_order = vec(len); front_order[0] = back_order[len-1] = 1; for (int i=1; i<len; i++) { front_order[i] = front_order[i-1]*A[i-1]; } for (int i=len-2; i>=0; i--) { back_order[i] = back_order[i+1]*A[i+1]; } for (int i=0; i<len; i++) { ans[i] = front_order[i] * back_order[i]; } return ans; } };