劍指 offer:51、構(gòu)建乘積數(shù)組

51. 構(gòu)建乘積數(shù)組

題目描述

給定一個(gè)數(shù)組A[0,1,...,n-1],請(qǐng)構(gòu)建一個(gè)數(shù)組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

解題思路:

  • 思路1: 遍歷數(shù)組,時(shí)間復(fù)雜度O(n)
  • 思路2:
    Bi A0 A1 A2 ... An-2 An-1
    B0 1 A1 A2 ... An-2 An-1
    B1 A0 1 A2 ... An-2 An-1
    B2 A0 A1 1 ... An-2 An-1
    B0 ... ... ... ... ... ...
    Bn-2 A0 A1 A2 ... 1 An-1
    Bn-1 A0 A1 A2 ... An-2 1
    通過觀察,Bi的值可以看作表格中每一行的乘積,下三角連乘易求得,上三角,從下向上也是連乘,所以我們可以先計(jì)算下三角中的連乘,再算上三角的連乘,將Bi兩部分相乘即可。

解答:

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

// 解法2:
class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        int len = A.size();
        vector<int> B(len);
        if(len <= 0)
            return B;
        B[0] = 1;
        // 計(jì)算下三角
        for(int i = 1; i < len; ++i)
        {
            B[i] = B[i-1] * A[i-1];
        }
        int tmp = 1;
        //計(jì)算上三角
        for(int i = len - 2; i >= 0; --i)
        {
            tmp *= A[i+1];
            B[i] *= tmp;
        }
        return B;
    }
};

大家有興趣可以訪問我的個(gè)人博客,不定時(shí)更新一些內(nèi)容哦!

圖片來自必應(yīng)壁紙
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容