leetcode_238 除自身以外的数组乘积

1. 题意

除了自身外的乘积,题目要求不能用除法做。

2. 题解

不用除法做,那就用前后缀分解的方法做。

时间复杂度O(n)O(n)O(n)

  • 两个数组记录前后缀乘积
cpp 复制代码
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> pre(n);
        vector<int> suf(n);
        
        pre[0] = 1;
        for (int i = 1; i < n; ++i)
            pre[i] = nums[i - 1] * pre[i - 1];

        suf[0] = 1;
        for (int i = n - 1;i > 0; --i) {
            suf[n - i] = suf[n - i - 1] * nums[i];
        }

        vector<int> ans(n, 1);

        for (int i = 0;i < n; ++i)
            ans[i] = pre[i] * suf[n - 1 - i];

        return ans;
    }
};

事实上这个两个数组空间都可以直接优化掉,下面的空间复杂度为O(1)O(1)O(1)

cpp 复制代码
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();

        vector<int> ans(n, 1);
        
        
        int pre = 1;
        for (int i = 1;i < n; ++i) {
            pre *= nums[i - 1];
            ans[i] *= pre;
        }

        int suf = 1;
        for (int i = n - 2; ~i; --i) {
            suf *= nums[i + 1];
            ans[i] *= suf;
        }

        return ans;
    }
};```