LeetCode 238. Product of Array Except Self 题解(C++)

LeetCode 238. Product of Array Except Self 题解(C++)


题目描述

  • 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].
  • Solve it without division and in O(n).

示例

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

补充

  • 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.)

思路

  • 这里可以使用两个for循环实现。设置一个输出数组output,长度与nums一样,并将所有元素置1。每一个for循环都遍历数组的每一个元素(假设分别用i,j指向数组output,nums的下标),若i!=j,则将output[i]*nums[j]的结果赋给output[i]即可。这里的时间复杂度为O(n^2),在leetcode上运行时间超时。
  • 第二种思路可以把所有元素相乘,之后再用一个循环,循环把所有元素的乘积除以每一个元素即可得到结果,这里需要注意的是有0的情况。时间复杂度为O(n),但是题目要求不能使用除法。

最优解

  • 假设输入数组为[2,3,4,5],则可以将每个元素分为左边的乘积和右边的乘积,之后将左右乘积再相乘得到结果。若为左边第一个元素,无左乘积,则左乘积等于1,右边第一个元素同理。如下所示:
    这里写图片描述
  • 首先创建一个长度跟输入数组nums一样的数组output,并把所有元素置1,之后对output数组从下标1开始循环(下标0的元素是左边第一个元素,为1),output[i] = output[i-1] * nums[i-1],所得的数组为left(即元素左乘积);
  • 之后再使用一个for循环,这里先使right等于1(相当于右边第一个元素,其无右乘积,故其值为1),从最后一个元素开始循环,output[i] = output[i] * right,所得的output即为所求的值,这里right(即每个元素的右乘积)每次需要乘上nums[i]保持更新。

代码

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

        int right = 1;
        for (int i = count-1; i >= 0; --i)
        {
            output[i] *= right;
            right *= nums[i];
        }

        return output;
    }
};

你可能感兴趣的:(LeetCode)