Maximum Product Subarray
Problem
https://leetcode.com/problems/maximum-product-subarray/
Given an integer array nums, find a subarray that has the largest
product, and return the product.
The test cases are generated so that the answer will fit in a 32-bit integer.
Note that the product of an array with a single element is the value of that element.
Example 1:
Input: nums = [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Example 2:
Input: nums = [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
Constraints:
1 <= nums.length <= 2 * 10:sup:`4`-10 <= nums[i] <= 10The product of any subarray of
numsis guaranteed to fit in a 32-bit integer.
Pattern
Array, Dynamic Programming
Approaches
Explanation
If we scan left to right, at each index we must decide whether to extend the current subarray or start over. However, because multiplying by a negative number flips the sign, the most negative product ending at the previous index can become the most positive after one multiplication. This means we need to track the maximum and minimum product, because the minimum might produce the next maximum.
At each index i, the candidates for the new maximum product are:
1. nums[i] (start fresh)
2. max_product * nums[i] (extend a positive run)
3. min_product * nums[i] (negative flips to positive)
We also compute the minumum from these 3 candidates. The final answer is
the largest max_product seen across all indices.
Code
def maxProduct(nums: list[int]) -> int:
"""Given an integer array ``nums``, return the maximum product of all
subarrays.
"""
max_product = nums[0]
min_product = nums[0]
result = nums[0]
for num in nums[1:]:
candidates = [num, max_product * num, min_product * num]
max_product = max(candidates)
min_product = min(candidates)
result = max(result, max_product)
return result
Test
>>> from maximum_product_subarray__dynamic_programming import maxProduct
>>> maxProduct([2, 3, -2, 4])
6
>>> maxProduct([-2, 0, -1])
0
Complexity
\(n\) is the number of elements in nums
Measure |
Complexity |
Notes |
|---|---|---|
Time |
\(O(n)\) |
one pass through the array |
Auxiliary Space |
\(O(1)\) |
3 variables: |
- maximum_product_subarray__dynamic_programming.maxProduct(nums: list[int]) int
Given an integer array
nums, return the maximum product of all subarrays.