# [Product of Array Except Self](https://leetcode.com/problems/product-of-array-except-self/) ###### tags: `Leetcode`, `Medium`, `Arrays and Hashing` ## Approach * Initialize two lists: * PreFixArray: This will have the same length as the input array. At every index position this list will have the product of all the numbers occuring before it in the input array * PostFixArray: This will have the same length as the input array. At every index position this list will have the product of all the numbers occuring after it in the input array * In the result array at every index position add the product of the numbers at the same index position in PreFixArray and PostFixArray * Return the result array ### O(1) Space Complexity Solution * Same approach as the previous one but instead of initializing the pre and post fix arrays, do it on the fly in the result array ## Asymptotic Analysis ### Time Complexity: **O(N)** ### Space Complexity: **O(N)** ## Code ``` python from typing import List class ProductOfArrayExceptSelf: @staticmethod def product_except_self_linear_space(numbers: List[int]) -> List[int]: postfix, prefix = [1] * len(numbers), [1] * len(numbers) result = [1] * len(numbers) # Populate prefix list for index in range(1, len(numbers)): prefix[index] = numbers[index - 1] * prefix[index - 1] # Populate postfix list for index in range(len(numbers) - 2, -1, -1): postfix[index] = numbers[index + 1] * postfix[index + 1] # Populate result list for index in range(len(numbers)): result[index] = prefix[index] * postfix[index] return result @staticmethod def product_except_self_constant_space(numbers: List[int]) -> List[int]: prefix, postfix = 1, 1 result = [1] * len(numbers) # Populate prefix result for index in range(len(numbers)): result[index] = prefix prefix *= numbers[index] # Populate postfix result for index in range(len(numbers) - 1, -1, -1): result[index] *= postfix postfix *= numbers[index] return result nums = [1, 2, 3, 4] print(ProductOfArrayExceptSelf.product_except_self_linear_space(nums)) print(ProductOfArrayExceptSelf.product_except_self_constant_space(nums)) ```