Array & Hashing

04. Product of Array Except Self

Given an integer array nums, return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i].

The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.

You must write an algorithm that runs in O(n) time and without using the division operation.

Examples

Example 1

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

Example 2

Input: nums = [-1,1,0,-3,3]
Output: [0,0,9,0,0]

Constraints

  • 2 <= nums.length <= 10^5
  • -30 <= nums[i] <= 30
  • The input is generated such that answer[i] fits in a 32-bit integer.

Follow-up

Can you solve the problem in O(1) extra space complexity? (The output array does not count as extra space.)

Dado un arreglo de enteros nums, devuelve un arreglo answer tal que answer[i] es igual al producto de todos los elementos de nums excepto nums[i].

Se garantiza que el producto de cualquier prefijo o sufijo de nums cabe en un entero de 32 bits.

Debes escribir un algoritmo que funcione en O(n) tiempo y sin usar la operacion de division.

Ejemplos

Ejemplo 1

Entrada: nums = [1,2,3,4]
Salida: [24,12,8,6]

Ejemplo 2

Entrada: nums = [-1,1,0,-3,3]
Salida: [0,0,9,0,0]

Restricciones

  • 2 <= nums.length <= 10^5
  • -30 <= nums[i] <= 30
  • Se garantiza que answer[i] cabe en un entero de 32 bits.

Desafio adicional

Puedes resolver el problema usando O(1) espacio extra? (El arreglo de salida no cuenta como espacio extra.)

product-of-array-except-self.py
from typing import List

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        n: int = len(nums)
        answer: List[int] = [1] * n  # final result

        # Step 1: compute prefix products (left to right)
        prefix: int = 1
        for i in range(n):
            answer[i] = prefix
            prefix *= nums[i]

        # Step 2: compute suffix products (right to left)
        suffix: int = 1
        for i in range(n - 1, -1, -1):
            answer[i] *= suffix
            suffix *= nums[i]

        return answer
Keyboard shortcuts
h Previous problem
l Next problem
Esc Back to index
? Toggle this help