Leetcode 除自身以外数组的乘积

分析:这道题不能使用除法,显而易见的方法就是左边的乘积乘以右边的乘积,这样很好理解。

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

进阶:题目还提到在时间复杂度O(n)的情况下,是否可以在空间复杂度为常数的级别内完成。

分析:由于输出肯定是需要一个O(n)的数组的,题目说这个不纳入空间复杂度,上面用了三个数组,砍掉两个就好了。我们可以直接用left就当ans返回,在left里面更新,这样就可以砍掉ans。然后我们直接从后面开始更新,用一个int变量直接记录后面数字的乘积,这样就把right也给砍掉了。不过肯定没上面这个好看,好理解,好想。

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int>left(n);
        left[0] = 1;
        for(int i = 1; i < n; ++i) {
            left[i] = left[i - 1] * nums[i - 1];//第i个位置存放0到i-1的乘积
        }
        int right = 1;
        for(int i = n - 1; i >= 0; --i) {
            left[i] *= right;
            right *= nums[i];
        }
        return left;
    }
};

 

posted @ 2018-12-27 14:38  llzhh  阅读(339)  评论(0编辑  收藏  举报