1. 程式人生 > 實用技巧 >LeetCode238. 除自身以外陣列的乘積

LeetCode238. 除自身以外陣列的乘積

要求出某個數除自身以外的陣列的乘積,就要求出這個數前面所有數的乘積和這個數後面的所有數的乘積。

求出這個數前面或者後面所有數的乘積可以用字首和或者字尾和對陣列元素進行連續的乘積得到,但是由於這題限制了我們
只能開一個數組(最後的返回陣列),所以字首和用了陣列記錄之後,字尾和不能再用陣列了。

不過沒關係,字首和已經記錄了每個元素之前的所有元素的乘積,我們只要從後往前遍歷的時候,用一個額外的變數suffix記錄
當前元素之後所有元素的乘積即可,每次更新了res陣列之後,suffix *= nums[i],這樣就更新了字尾和。

從後往前遍歷陣列結束之後,res陣列的每個位置的結果就是除nums[i]以外的其他所有元素的乘積。

程式碼如下:

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int size = nums.size();
        vector<int> res(size);                  //res[i]表示nums[0...i-1]的乘積
        res[0] = 1;                             //0之前沒有元素,res[0] = 1
        for(int i = 1; i < size; ++i) {            
            res[i] = res[i - 1] * nums[i - 1];      //nums[0...i-1]的乘積就是nums[0...i-2]的乘積再乘上nums[i-1]
        }
        int suffix = 1;                              //變數suffix記錄當前元素之後的所有元素的乘積,初始為1
        for(int i = size - 1; i >= 0; --i) {
            res[i] *= suffix;                        //res[i]記錄了當前元素之前的所有元素的乘積,suffix記錄了當前元素之後的所有元素的乘積,二者相乘,就是除自身元素以外的所有元素的乘積
            suffix *= nums[i];                  //更新suffix
        }
        return res;
    }
};