ProductOfArrayExceptSelf
Problem
https://leetcode.com/problems/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.
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:sup:`5`-30 <= nums[i] <= 30The input is generated such that
answer[i]is guaranteed to fit 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 for
space complexity analysis.)
Solution
Observe that the product of all elements except the element at index i is the
product of all elements nums[:i - 1] multiplied by the product of all
elements nums[i + 1:]. Iterate through nums once to compute the product
of all elements nums[:i - 1] and store the result in a list products.
Start with left_product = 1 and append it to products before
multiplying with the next element in nums. Iterate through nums in
reverse to compute the product of all elements nums[i + 1:] and multiply
the result by the corresponding element in products to obtains the product
of all elements except the element at index \(i\).
Pattern
Array, Prefix Sum
Code
from typing import List
def productExceptSelf(nums: List[int]) -> List[int]:
"""Product of all elements except the element at index ``i`` for each index
``i`` in ``nums``.
"""
products = []
left_product = 1
for num in nums:
products.append(left_product)
left_product *= num
right_product = 1
for i in range(len(nums) - 1, -1, -1):
products[i] *= right_product
right_product *= nums[i]
return products
Test
>>> from ProductOfArrayExceptSelf import productExceptSelf
>>> productExceptSelf([1, 2, 3, 4])
[24, 12, 8, 6]
>>> productExceptSelf([-1, 1, 0, -3, 3])
[0, 0, 9, 0, 0]
- ProductOfArrayExceptSelf.productExceptSelf(nums: List[int]) List[int]
Product of all elements except the element at index
ifor each indexiinnums.