leetcode騰訊精選練習之除自身之外數組的乘積(十)

最長公共前綴

題目

給定長度爲 n 的整數數組 nums,其中 n > 1,返回輸出數組 output ,其中 output[i] 等於 nums 中除 nums[i] 以外其他各元素的乘積。
示例:
輸入: [1,2,3,4]
輸出: [24,12,8,6]
說明: 請不要使用除法,且在 O(n) 時間複雜度內完成此題。數組

思路

第一種思路O(n2):可是不符合題目要求
兩層循環遍歷,思路很簡單不詳細說了第一層遍歷數組中中的每一個數,第二層遍歷求解除了自己以外的乘積。
第二種思路就是除法:也不符合題目要求
1.全部的數字相乘除去自己便可獲得結果。
2.須要注意0的問題,若是有一個0,那麼除了0那個爲止以外的全部結果都是0,0位置處的結果是其餘數字的乘積。若是有兩個零,那麼結果的全部值都是0。

第三種思路:
每一個結果都是這個數左邊的數字的乘積和右邊的數字的乘積,而後在相乘的出來的。
因此先求出每一個數字左遍的乘積,前後再求出右邊的乘積,進行相乘便可獲得結果。
舉個例子:先列出數組[1,2,3,4]左邊的數字的乘積以下所示:
code

1 2 3 4
1 1 2 6

而後在列出全部數字右遍的數的乘積以下所示:table

1 2 3 4
24 12 4 1

而後將左邊數字和右邊數字的乘積列在一塊兒,最後一行顯示結果若是下所示:class

1 2 3 4
1 1 2 6
24 12 4 1
24 12 8 6

將左邊數字的乘積和右邊數字的乘積相乘便可獲得最終的結果。循環

代碼

第一種思路:遍歷

vector<int> productExceptSelf(vector<int>& nums) {
    vector<int> res;
    int sz = nums.size();
    for (size_t i = 0; i < sz; i++)
    {
        int mul = 1;
        for (size_t j = 0; j < sz; j++)
        {
            if (i == j)
            {
                continue;
            }
            mul *= nums[j];
        }
        res.push_back(mul);
    }
}

第二種思路:方法

vector<int> productExceptSelf(vector<int>& nums) {
    vector<int> res;
    int sz = nums.size();
    int mul = 1;
    int zeroIndex = -1;
    int zeroNum = 0;
    for (size_t i = 0; i < sz; i++)
    {
        if (nums[i] != 0)
        {
            mul *= nums[i];
        }
        else 
        {
            zeroNum++;
            if (zeroNum > 1)
            {
                res.resize(sz, 0);
                return res;
            }
            zeroIndex = i;
        }
    }
    if (zeroNum != 0)
    {
        res.resize(sz, 0);
        res[zeroIndex] = mul;
    }
    else 
    {
        for (size_t i = 0; i < sz; i++)
        {
            res.push_back(mul / nums[i]);
        }
    }
    return res;
}

第三種思路:總結

vector<int> productExceptSelf(vector<int>& nums) {
    int sz = nums.size();
    vector<int> res(sz, 0);

    int tmp = 1;
    for (int i = 0; i < sz; i++) {
        res[i] = tmp;
        tmp *= nums[i];
    }

    tmp = 1;
    for (int i = sz - 1; i >= 0; i--) {
        res[i] *= tmp;
        tmp *= nums[i];
    }
    return res;
}

總結

這個題目總容易想到的就是前兩種方法,第三種題目要求的方法仍是須要多想一想tab

相關文章
相關標籤/搜索