238. 除自身以外数组的乘积

我的做法:
设置l数组记录元素i左边的乘积,r数组记录元素i右边的乘积,lr都包含了元素i,注意下标。
时间复杂度和空间复杂度都是O(n)

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> answer(n, 0);
        vector<int> l(n, 1);
        vector<int> r(n, 1);
        l[0] = nums[0], r[n - 1] = nums[n - 1];
        for (int i = 1; i < n; ++i) {
            l[i] = l[i - 1] * nums[i];
        }
        for (int i = n - 2; i >= 0;--i) {
            r[i] = r[i + 1] * nums[i];
        }
        for (int i = 0; i < n; ++i) {
            if (i == 0) answer[i] = r[i + 1];
            else if (i == n - 1) answer[i] = l[i - 1];
            else answer[i] = l[i - 1] * r[i + 1];
        }
        return answer;
    }
};

优化版:
直接使用answer数组来当作l数组,answer[i]表示元素i左边元素之积(不包含元素i),则在第一个元素的位置左边没有元素,answer[0]=1
然后开始计算左右乘积
将元素从末尾开始向前遍历,设置变量R记录元素i右边元素之积(不包含元素i),初始值R=1,每更新完一次answer[i]后,记得更新RR= R*nums[i]

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

你可能感兴趣的:(LeetCode,算法)