Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from typing import List, Union, Collection, Mapping, Optional
from abc import ABC, abstractmethod

class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
"""
Calculate product of all elements except self without division.

Strategy: Two-pass with prefix and suffix products
- First pass: Build prefix products (product of all elements to the left)
- Second pass: Build suffix products (product of all elements to the right)
- Result[i] = prefix[i] * suffix[i]

Optimization: Use output array to store prefix, then multiply by suffix in-place

Time: O(n), Space: O(1) excluding output array
"""

n = len(nums)
answer = [1] * n

# First pass: Calculate prefix products
# answer[i] contains product of all elements to the left of i
prefix = 1
for i in range(n):
answer[i] = prefix
prefix *= nums[i]

# Second pass: Calculate suffix products and multiply with prefix
# For each position, multiply existing prefix with product of all elements to the right
suffix = 1
for i in range(n - 1, -1, -1):
answer[i] *= suffix
suffix *= nums[i]

return answer
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
function productExceptSelf(nums: number[]): number[] {
const n = nums.length;
const answer: number[] = new Array(n).fill(1);

// First pass: prefix products
let prefix = 1;
for (let i = 0; i < n; i++) {
answer[i] = prefix;
prefix *= nums[i];
}

// Second pass: suffix products multiplied in-place
let suffix = 1;
for (let i = n - 1; i >= 0; i--) {
answer[i] *= suffix;
suffix *= nums[i];
}

return answer;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import unittest
from src.my_project.interviews.top_150_questions_round_23\
.ex_13_product_of_array_except_itself import Solution

class ProductExcetItselfTestCase(unittest.TestCase):

def test_product_first_case(self):
solution = Solution()
output = solution.productExceptSelf(nums = [1,2,3,4])
target = [24,12,8,6]
self.assertEqual(output, target)

def test_product_second_case(self):
solution = Solution()
output = solution.productExceptSelf(nums = [-1,1,0,-3,3])
target = [0,0,9,0,0]
self.assertEqual(output, target)
Loading