238. Product of Array Except Self

你快乐吗

Posted by bbkgl on November 24, 2019

似此星辰非昨夜

为谁风露立中宵。

C++,数学题,想到了就一分钟写完哈哈哈。

其实就是一个公式,设\( ans(i) \)为除了\(i \)以外的乘积,\( f(i) \)为从\(0 \)到\(i \)的乘积, \( h(i) \)为从\(n-1 \)到\(i \)的乘积:

\[ans(i) = f(i-1)h(n - i - 1) ​\]

最简单就是借助两个数组,一个记录从左到右的乘积,一个记录从右到左的乘积。

不过题目要求了空间复杂度O(1),就不能这样了,其实题目已经说了,不算用来储存结果的数组。

储存结果的数组可以记录从左到右的乘积,然后再用一个临时变量就能记录循环中,从\(n-1 \)到\(i \)的乘积了,理解了就想当简单。

代码如下:

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int left = 1, right = 1;
        int n = nums.size();
        vector<int> ans(n, 1);
        for (int i = 0; i < n; i++) {
            ans[i] *= left;
            left *= nums[i];
        }
        for (int i = n - 1; i >= 0; i--) {
            ans[i] *= right;
            right *= nums[i];
        }
        return ans;
    }
};