Skip to main content

Command Palette

Search for a command to run...

Easy Guide to Solving Product of Array Except Self on Leetcode

Updated
Easy Guide to Solving Product of Array Except Self on Leetcode

We have been asked to return an integer array such that it has elements in respective indices of a given integer array which are products of all the other elements except itself.

I.e., the array to be returned (say) output has elements such that, output[i] is the product of all elements in the given array nums, except nums[i].

The given constraints are:

  • The given array has at least 2 elements and a maximum of 105.

  • The individual element in the array can be in a range of -30 to 30 integers.

Let's try the method that would've probably come to your mind after reading the question (at least, this is what I got and am getting for any question I read in LeetCode for a while).


Nested Loops

vector<int> productExceptSelf(vector<int>& nums) {
  int len = nums.size();
  vector<int> result; // DO NOT Specify Size while DECLARING.
// It would create a array of size len with some junk or
// null values depending on the compiler. This would create a problem
// when using the push_back() function, as it will increase size and add the new element.
  int product;
  for (int i = 0; i < len; ++i) {
    product = 1;
    for (int j = 0; j< len; ++j) {
      if (i != j) {
        product *= nums[j];
      }
    }
    result.push_back(product);
  }
  return result;
}

Time Complexity: O(n2)

Cuz there is a loop inside a loop.


Dynamic Programming Approach

vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> o(n);
        o[0] = 1;
        for (int i = 1; i < n; ++i) {
            o[i] = o[i-1] * nums[i-1]; // multiplies the previous left
// values with the previous value. like if in [1, 2, 3, 4] we are in 3,
// this loop multiplies (1*2) * 3. where (1*2) is already present.
        }
        int right = 1;
        for (int i = n-1; i >=0; --i) { // this loop does a similar process
// as the previous loop, but the right var multiplies elements to the right
// of element [i].
            o[i] *= right;
            right *= nums[i];
        }

        return o;

Time Complexity: O(n)

This is like the time function adds n and n for each loop separately, hence the time complexity just takes n, ignoring the coefficient.

Please correct any mistakes that you encounter. I am and will still keep learning.

I did not mention the third method which does a good job with time complexity, but not so with space complexity. I did not add it here because it felt redundant as it was similar in approach to the second method. [2 loops here, 3 loops there]

More from this blog

J

Javagar's Dev Diary

12 posts