What if you could find the most profitable stretch in a sea of ups and downs without checking every possibility?
Why Maximum Product Subarray in DSA Typescript?
Imagine you have a list of numbers representing daily stock price changes. You want to find the period where the product of these changes is the highest to decide the best time to invest.
Trying every possible period manually means checking all combinations, which takes a very long time as the list grows. It's easy to make mistakes and miss the best period.
The Maximum Product Subarray method quickly finds the best continuous period by smartly tracking products as it moves through the list, handling positive and negative numbers without checking every combination.
let maxProduct = -Infinity; for (let i = 0; i < nums.length; i++) { for (let j = i; j < nums.length; j++) { let product = 1; for (let k = i; k <= j; k++) { product *= nums[k]; } if (product > maxProduct) maxProduct = product; } }
let maxProduct = nums[0]; let currentMax = nums[0]; let currentMin = nums[0]; for (let i = 1; i < nums.length; i++) { const num = nums[i]; if (num === 0) { currentMax = 1; currentMin = 1; maxProduct = Math.max(maxProduct, 0); continue; } let tempMax = currentMax * num; currentMax = Math.max(num, tempMax, currentMin * num); currentMin = Math.min(num, tempMax, currentMin * num); maxProduct = Math.max(maxProduct, currentMax); }
This method lets you find the best continuous segment for maximum product quickly, even with negative and zero values mixed in.
In finance, it helps find the best period of consecutive days where stock returns multiply to the highest gain, guiding smart investment decisions.
Manual checking of all subarrays is slow and error-prone.
Tracking max and min products at each step handles negatives and zeros efficiently.
Enables fast, reliable detection of maximum product subarray in a list.
Practice
Solution
Step 1: Understand the problem statement
The problem asks for a contiguous part of the array where the product of all numbers is as large as possible.Step 2: Differentiate from similar problems
This is different from finding the largest sum or smallest product; it specifically focuses on the product of elements in a continuous segment.Final Answer:
The contiguous subarray with the largest product of its elements -> Option BQuick Check:
Maximum product subarray means largest product segment [OK]
- Confusing product with sum
- Ignoring that subarray must be contiguous
- Thinking about longest subarray instead of max product
Solution
Step 1: Check input parameter type
The input should be an array of numbers, so nums: number[] is correct.Step 2: Check return type
The function returns the maximum product value, which is a number, not an array or string.Final Answer:
function maxProduct(nums: number[]): number -> Option AQuick Check:
Input array, output number matches signature [OK]
- Using string type for input or output
- Returning array instead of number
- Incorrect parameter types
function maxProduct(nums: number[]): number {
let maxProd = nums[0];
let minProd = nums[0];
let result = nums[0];
for (let i = 1; i < nums.length; i++) {
if (nums[i] < 0) {
[maxProd, minProd] = [minProd, maxProd];
}
maxProd = Math.max(nums[i], maxProd * nums[i]);
minProd = Math.min(nums[i], minProd * nums[i]);
result = Math.max(result, maxProd);
}
return result;
}
console.log(maxProduct([2, 3, -2, 4]));Solution
Step 1: Initialize variables and start loop
maxProd, minProd, and result start at 2. Loop from index 1 to 3.Step 2: Iterate and update maxProd, minProd, and result
At i=1 (3): maxProd = max(3, 2*3)=6, minProd = min(3, 2*3)=3, result=6.
At i=2 (-2): nums[i]<0, swap maxProd and minProd: maxProd=3, minProd=6.
maxProd = max(-2, 3*(-2)) = max(-2, -6) = -2.
minProd = min(-2, 6*(-2)) = min(-2, -12) = -12.
result = max(6, -2) = 6.
At i=3 (4): maxProd = max(4, -2*4) = max(4, -8) = 4.
minProd = min(4, -12*4) = min(4, -48) = -48.
result = max(6, 4) = 6.Final Answer:
6 -> Option AQuick Check:
Max product subarray is [2,3] = 6 [OK]
- Not swapping max and min on negative number
- Only tracking max product, ignoring min product
- Confusing max product with sum
function maxProduct(nums: number[]): number {
let maxProd = 1;
let minProd = 1;
let result = Number.MIN_VALUE;
for (let num of nums) {
if (num < 0) {
let temp = maxProd;
maxProd = minProd;
minProd = temp;
}
maxProd = Math.max(num, maxProd * num);
minProd = Math.min(num, minProd * num);
result = Math.max(result, maxProd);
}
return result;
}Solution
Step 1: Understand Number.MIN_VALUE usage
Number.MIN_VALUE is the smallest positive number close to zero, not the most negative number.Step 2: Correct initialization for result
To track maximum product correctly, result should start at Number.NEGATIVE_INFINITY to handle negative products properly.Final Answer:
Using Number.MIN_VALUE instead of Number.NEGATIVE_INFINITY for result -> Option DQuick Check:
Use Number.NEGATIVE_INFINITY for max tracking [OK]
- Confusing Number.MIN_VALUE with negative infinity
- Not swapping max and min on negative number
- Wrong initial values for maxProd and minProd
[-1, -3, -10, 0, 60], what is the maximum product subarray and its product?Solution
Step 1: Analyze subarrays and their products
Check products of contiguous subarrays:
[-1] = -1
[-1, -3] = 3
[-1, -3, -10] = -30
[-3] = -3
[-3, -10] = 30
[-10] = -10
[0] = 0
[60] = 60Step 2: Identify maximum product
The largest product found is 60 from subarray [60].Final Answer:
Subarray: [60], Product: 60 -> Option CQuick Check:
Max product is 60 from single element [60] [OK]
- Assuming negative product is maximum
- Ignoring single element subarrays
- Confusing zero product with max product
Ready to prove it?
Pass the test and this pattern moves unknown
