【劍指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[0]=A[1] * A[2] * … * A[n-1]; 不乘A[0]
B[1]=A[0] * A[2] * … * A[n-1]; 不乘A[1]

B[n-1] = A[0] * A[1] * … * A[n-2];不乘A[n-1]

思路

思路主要是這張圖:
在這裏插入圖片描述
把每行1左右的兩部分分開算:

01 下三角計算(1的左邊部分):(自上而下)
B[0]=1;
B[1]=B[0]*A[0];
B[2]=B[1]*A[1]

B[n-1]=B[n-2]*A[n-2]

02 上三角計算(每行1的右邊部分):(自下而上,記爲tmp)
tmp[n-1]=1;
tmp[n-2]=tmp[n-1]*A[n-1];

tmp[0]=tmp[1]*A[1];

03 最後進行每行整體計算(把每行左右兩部分乘起來):
B[0]=B[0]*tmp[0];
B[1]=B[1]*tmp[1];

B[n-1]=B[ni-1]*tmp[n-1];

在寫代碼的時候,因爲只計算tmp[n-2]的值只需要記住tmp[n-1]的值,因此我們沒有設置數組tmp[];而設置的變量tmp,每次計算完該行的值,直接讓B[n-1]=B[n-1]*tmp;然後tmp的值留着下次用。

代碼

class Solution {
public:
     vector<int> multiply(const vector<int>& A) {
        int len = A.size();
        vector<int>B(len);
        if (len == 0) return B;
        //01 就算下三角每行的乘積(自上而下)
        B[0] = 1;
        for (int i = 1; i < len; ++i) {
            B[i] = B[i - 1] * A[i - 1];
        }
        //02 tmp 爲下三角每行的乘積(自下而上)
        int tmp = 1;
        for (int j = len - 2; j >=0; --j) {
            tmp *= A[j + 1];
            B[j] *= tmp;//直接得出最後的結果
        }
        return B;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章