LintCode 1310: Product of Array (数组好题)

本文探讨了在不使用除法的情况下,计算数组中每个元素的乘积,但排除当前元素的方法。通过两次遍历数组,一次从左到右记录前缀乘积,一次从右到左记录后缀乘积,最终得到所有元素的除自身外乘积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. Product of Array Except Self
    Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].

Example
For example, given [1,2,3,4], return [24,12,8,6].

Challenge
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)

Notice
Solve it without division and in O(n).

解法1:
思路:用两个array: forward 和 backward。

代码如下:

class Solution {
public:
    /**
     * @param nums: an array of integers
     * @return: the product of all the elements of nums except nums[i].
     */
    vector<int> productExceptSelf(vector<int> &nums) {
        
        int len = nums.size();
        
        if (len == 0) return vector<int>();
        if (len == 1) return nums;
        
        vector<int> result(len, 0);
        vector<int> forward(len, 0);
        vector<int> backward(len, 0);
        
        forward[0] = nums[0];
        for (int i = 1; i < len; ++i) {
            forward[i] = forward[i - 1] * nums[i];
        }

        backward[len - 1] = nums[len - 1];
        for (int i = len - 2; i >= 0; --i) {
            backward[i] = backward[i + 1] * nums[i];
        }
        
        for (int i = 1; i < len - 1; ++i) {
            result[i] = forward[i - 1] * backward[i + 1];
        }
        result[0] = backward[1];
        result[len - 1] = forward[len - 2];
        
        return result;
    }
};

解法2:一个array,直接基于return array操作。反向数组用一个变量代替即可。
代码如下:

class Solution {
public:
    /**
     * @param nums: an array of integers
     * @return: the product of all the elements of nums except nums[i].
     */
    vector<int> productExceptSelf(vector<int> &nums) {
        
        int len = nums.size();
        
        if (len == 0) return vector<int>();
        if (len == 1) return nums;
        
        vector<int> result(len, 1);
        for (int i = 1; i < len; ++i) { 
             //note result[i] only records the forward product of i - 1
            result[i] = result[i - 1] * nums[i - 1];
        }

        int backwardProduct = 1;
        for (int i = len - 1; i >= 0; --i) {
            result[i] = result[i] * backwardProduct;
            backwardProduct *= nums[i];
        }
         
        return result;
    }
};

二刷:

class Solution {
public:
    /**
     * @param nums: an array of integers
     * @return: the product of all the elements of nums except nums[i].
     */
    vector<int> productExceptSelf(vector<int> &nums) {
        int n = nums.size();
        vector<int> res(n, 1);
        res[0] = nums[0];
        for (int i = 1; i < n - 1; i++) {
            res[i] = res[i - 1] * nums[i];
        }
        int backwardProd = 1;
        for (int i = n - 1; i >= 1; i--) {
            res[i] = res[i - 1] * backwardProd;
            backwardProd *= nums[i];
        }
        res[0] = backwardProd;
        return res;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值