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

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

题目详情

题目链接
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

  • 示例:
    输入: [1,2,3,4]
    输出: [24,12,8,6]

提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

进阶:

  • 你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

我的代码

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int total = 1, zero = 0;
        for (auto &num: nums) {
            if (num == 0) {
                ++zero;
            } else {
                total *= num;
            }
        }
        if (zero > 1) {
            return vector<int> (nums.size(), 0);
        }
        vector<int> res;
        res.reserve(nums.size());
        for (auto &num: nums) {
            if (num == 0) {
                res.emplace_back(total);
            } else {
                if (zero) {
                    res.emplace_back(0);
                } else {
                    res.emplace_back(total / num);
                }
            }
        }
        return res;
    }
};

我的成绩

执行结果:通过
执行用时 : 20 ms, 在所有 C++ 提交中击败了70.86%的用户
内存消耗 : 15.5 MB, 在所有 C++ 提交中击败了14.29%的用户

一些想法

本道题我并没有能满足限制条件。。。

执行用时为 0 ms 的范例

class Solution 
{
public:
    vector<int> productExceptSelf(vector<int>& nums) 
    {
        int n = nums.size();
        
        //把向量output初始化为1
        vector<int> output(n,1);  

        //采用两端同时累乘,最终得到的ouput[i]的值即除nums[i]以外的乘积
        int left = 1,right = 1;
        for(int i = 0; i < n; i++)
        {
            //0~i-1项乘积置于output[i]
            output[i] *= left;    
            left *= nums[i];

            //output[i]再乘以i+1~n-1项
            output[n-1-i] *= right;
            right *= nums[n-1-i];
        }
        
        return output;
    }
};

思考

范例的做法确实好,分别用left和right存储两边的乘积,只需要一次遍历。

你可能感兴趣的:(我的leetcode刷题系列)