Problem

Given an array, return an array where each element is the product of all other elements. Solve in O(n) without division.

Example

Input:  [1,2,3,4]
Output: [24,12,8,6]

Solution

Two passes: left-to-right multiplies prefix products, right-to-left multiplies suffix products.

def product_except_self(nums):
    n = len(nums)
    result = [1] * n
    left = 1
    for i in range(n):
        result[i] = left
        left *= nums[i]
    right = 1
    for i in range(n - 1, -1, -1):
        result[i] *= right
        right *= nums[i]
    return result
function productExceptSelf(nums) {
    const result = new Array(nums.length).fill(1);
    let left = 1;
    for (let i = 0; i < nums.length; i++) {
        result[i] = left;
        left *= nums[i];
    }
    let right = 1;
    for (let i = nums.length - 1; i >= 0; i--) {
        result[i] *= right;
        right *= nums[i];
    }
    return result;
}
vector<int> productExceptSelf(vector<int>& nums) {
    int n = nums.size();
    vector<int> result(n, 1);
    int left = 1;
    for (int i = 0; i < n; i++) { result[i] = left; left *= nums[i]; }
    int right = 1;
    for (int i = n - 1; i >= 0; i--) { result[i] *= right; right *= nums[i]; }
    return result;
}
public int[] productExceptSelf(int[] nums) {
    int n = nums.length;
    int[] result = new int[n];
    int left = 1;
    for (int i = 0; i < n; i++) { result[i] = left; left *= nums[i]; }
    int right = 1;
    for (int i = n - 1; i >= 0; i--) { result[i] *= right; right *= nums[i]; }
    return result;
}

Complexity

  • Time: O(n)
  • Space: O(1) extra

Explanation

Each element’s answer is (product of elements to its left) * (product of elements to its right). Two passes accumulate each side.

Share this article

Comments

Join the discussion. Got a question, found an issue, or want to share your experience?

Leave a Comment

Your email stays private. We just use it for replies.

Nothing to preview yet.

Use **bold**, *italic*, `code`, ```code blocks```, [link](url), > quote, - list