Maximum Product Subarray in DSA Python - Time & Space Complexity
We want to understand how the time needed to find the maximum product of a subarray changes as the input size grows.
How does the number of steps grow when the array gets bigger?
Analyze the time complexity of the following code snippet.
def max_product_subarray(nums):
max_prod = min_prod = result = nums[0]
for num in nums[1:]:
candidates = (num, max_prod * num, min_prod * num)
max_prod = max(candidates)
min_prod = min(candidates)
result = max(result, max_prod)
return result
This code finds the maximum product of any contiguous subarray in the given list.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: One loop that goes through the array once.
- How many times: Exactly once for each element after the first.
Each new element adds a fixed number of steps to update max and min products and the result.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 9 steps (one per element after first) |
| 100 | About 99 steps |
| 1000 | About 999 steps |
Pattern observation: The number of steps grows directly with the size of the input.
Time Complexity: O(n)
This means the time to find the maximum product grows in a straight line as the input size grows.
[X] Wrong: "Because we check multiple candidates each step, the time is O(n³)."
[OK] Correct: We only do a fixed number of checks per element, so the total steps grow linearly, not cubically.
Understanding this linear time approach shows you can handle tricky problems efficiently, a skill valued in many coding challenges.
"What if we used nested loops to check all subarrays? How would the time complexity change?"
Practice
Maximum Product Subarray problem ask you to find in an integer array?Solution
Step 1: Understand the problem statement
The problem asks for a contiguous part of the array where the product of all elements is the highest possible.Step 2: Compare options with problem goal
Only The contiguous subarray with the largest product of its elements matches the goal of finding the maximum product of a contiguous subarray.Final Answer:
The contiguous subarray with the largest product of its elements -> Option CQuick Check:
Maximum product subarray = largest product contiguous segment [OK]
- Confusing product with sum
- Ignoring the contiguous subarray condition
- Thinking about smallest product instead
Solution
Step 1: Understand initialization for max and min products
We start with the first element as initial max, min, and result because the subarray must include at least one element.Step 2: Check each option's correctness
max_prod = nums[0]; min_prod = nums[0]; result = nums[0] correctly initializes all three variables to the first element of the array, which is standard practice.Final Answer:
max_prod = nums[0]; min_prod = nums[0]; result = nums[0] -> Option DQuick Check:
Initialize with first element to track products [OK]
- Initializing with zero causes wrong results if array has negatives
- Using None causes errors in multiplication
- Using infinity values breaks logic
def maxProduct(nums):
max_prod = min_prod = result = nums[0]
for n in nums[1:]:
candidates = (n, max_prod * n, min_prod * n)
max_prod = max(candidates)
min_prod = min(candidates)
result = max(result, max_prod)
return result
print(maxProduct([2,3,-2,4]))Solution
Step 1: Trace the loop with input [2,3,-2,4]
Start: max_prod = min_prod = result = 2 Iteration 1 (n=3): candidates = (3, 2*3=6, 2*3=6) max_prod=6, min_prod=3, result=6 Iteration 2 (n=-2): candidates = (-2, 6*(-2)=-12, 3*(-2)=-6) max_prod=-2, min_prod=-12, result=6 Iteration 3 (n=4): candidates = (4, -2*4=-8, -12*4=-48) max_prod=4, min_prod=-48, result=6Step 2: Determine final result
The maximum product found during iterations is 6.Final Answer:
6 -> Option BQuick Check:
Maximum product subarray = 6 [OK]
- Ignoring min product when negative flips sign
- Only tracking max product causes wrong answer
- Not updating result each iteration
def maxProduct(nums):
max_prod = min_prod = result = 0
for n in nums:
temp_max = max_prod
max_prod = max(n, max_prod * n, min_prod * n)
min_prod = min(n, temp_max * n, min_prod * n)
result = max(result, max_prod)
return resultSolution
Step 1: Check variable initialization
Initializing max_prod, min_prod, and result to 0 causes errors if all numbers are negative or first element is not zero.Step 2: Compare with correct initialization
Correct approach initializes these variables to nums[0] to handle negative and positive values properly.Final Answer:
Initializing max_prod, min_prod, and result to 0 instead of nums[0] -> Option AQuick Check:
Initialize with first element, not zero [OK]
- Starting max/min product at zero causes wrong results
- Not handling negative numbers properly
- Forgetting to update result each iteration
nums = [1, -2, -3, 0, 7, -8, -2], what is the maximum product of any contiguous subarray?Solution
Step 1: Identify subarrays with max product
Check subarrays: - [1, -2, -3] product = 1 * -2 * -3 = 6 - [7] product = 7 - [7, -8, -2] product = 7 * -8 * -2 = 112 (since -8 * -2 = 16, 7 * 16 = 112) - Others are smaller or zeroStep 2: Confirm maximum product
The largest product found is 112 from subarray [7, -8, -2].Final Answer:
112 -> Option AQuick Check:
Max product subarray = 112 [OK]
- Ignoring negative number pairs that increase product
- Stopping at zero without checking after
- Only considering single elements
Ready to prove it?
Pass the test and this pattern moves unknown
