What if you could find the most profitable stretch in a sea of numbers without checking every possibility?
Why Maximum Product Subarray in DSA C?
Imagine you have a list of numbers representing daily changes in stock prices. You want to find the best period where multiplying these changes gives the highest profit. Doing this by checking every possible period manually is like trying to find a needle in a haystack.
Manually checking every possible sub-list to find the maximum product is very slow and tiring. It takes a lot of time because you have to multiply many combinations, and it's easy to make mistakes with negative numbers and zeros.
The Maximum Product Subarray method quickly finds the best continuous period by smartly keeping track of the highest and lowest products so far. It handles negative numbers and zeros without checking every possibility, saving time and effort.
int maxProduct(int* nums, int numsSize) {
int max_product = nums[0];
for (int i = 0; i < numsSize; i++) {
int product = 1;
for (int j = i; j < numsSize; j++) {
product *= nums[j];
if (product > max_product) max_product = product;
}
}
return max_product;
}int maxProduct(int* nums, int numsSize) {
int max_so_far = nums[0], min_so_far = nums[0], result = nums[0];
for (int i = 1; i < numsSize; i++) {
if (nums[i] < 0) {
int temp = max_so_far;
max_so_far = min_so_far;
min_so_far = temp;
}
max_so_far = nums[i] > max_so_far * nums[i] ? nums[i] : max_so_far * nums[i];
min_so_far = nums[i] < min_so_far * nums[i] ? nums[i] : min_so_far * nums[i];
if (max_so_far > result) result = max_so_far;
}
return result;
}This method lets you quickly find the best continuous segment for maximum multiplication, even with tricky negative numbers and zeros.
In finance, it helps find the best time to invest by analyzing daily percentage changes to maximize returns over a continuous period.
Manual checking is slow and error-prone for maximum product problems.
Tracking max and min products handles negatives and zeros efficiently.
Enables fast and reliable calculation of maximum product subarrays.
Practice
Solution
Step 1: Understand the problem and differentiate from similar problems
The problem asks for a contiguous part of the array where the product of all elements is the highest possible. Unlike maximum sum subarray, this problem focuses on product, which can be affected by negative numbers and zeros.Final Answer:
The contiguous subarray with the largest product of its elements -> Option DQuick Check:
Maximum product subarray = largest product subarray [OK]
- Confusing product with sum
- Ignoring negative numbers impact
- Thinking subarray can be non-contiguous
Solution
Step 1: Initialize maxProd and minProd properly and check alternatives
Both maxProd and minProd should start at 1 because multiplying by 1 does not change the product. Other initializations use zero (nullifies products), negative values, or leave variables uninitialized leading to incorrect calculations or undefined behavior.Final Answer:
int maxProd = 1, minProd = 1; -> Option AQuick Check:
Initialize maxProd and minProd to 1 [OK]
- Initializing maxProd or minProd to 0
- Not initializing both variables
- Using negative initial values
int arr[] = {2, 3, -2, 4};?
int maxProductSubarray(int* nums, int numsSize) {
int maxProd = nums[0], minProd = nums[0], result = nums[0];
for (int i = 1; i < numsSize; i++) {
if (nums[i] < 0) {
int temp = maxProd;
maxProd = minProd;
minProd = temp;
}
maxProd = (nums[i] > maxProd * nums[i]) ? nums[i] : maxProd * nums[i];
minProd = (nums[i] < minProd * nums[i]) ? nums[i] : minProd * nums[i];
if (maxProd > result) result = maxProd;
}
return result;
}
int main() {
int arr[] = {2, 3, -2, 4};
int size = sizeof(arr) / sizeof(arr[0]);
printf("%d", maxProductSubarray(arr, size));
return 0;
}Solution
Step 1: Trace the loop and determine final result
Start with maxProd=2, minProd=2, result=2. - i=1 (3): maxProd=max(3,2*3)=6, minProd=min(3,2*3)=3, result=6 - i=2 (-2): swap to maxProd=3, minProd=6; maxProd=max(-2,3*(-2))=-2, minProd=min(-2,6*(-2))=-12, result=6 - i=3 (4): maxProd=max(4,-2*4)=4, minProd=min(4,-12*4)=-48, result=6 The maximum product found is 6 from subarray [2,3].Final Answer:
6 -> Option BQuick Check:
Max product subarray = 6 [OK]
- Not swapping max and min on negative number
- Confusing max product with sum
- Incorrectly updating result
int maxProductSubarray(int* nums, int numsSize) {
int maxProd = 1, minProd = 1, result = nums[0];
for (int i = 0; i < numsSize; i++) {
if (nums[i] < 0) {
int temp = maxProd;
maxProd = minProd;
minProd = temp;
}
maxProd = (nums[i] > maxProd * nums[i]) ? nums[i] : maxProd * nums[i];
minProd = (nums[i] < minProd * nums[i]) ? nums[i] : minProd * nums[i];
if (maxProd > result) result = maxProd;
}
return result;
}Solution
Step 1: Check initialization and loop start; analyze other options
maxProd and minProd should start as nums[0] to correctly handle the first element. Loop should start from i=1 to avoid reprocessing first element. Removing swap breaks handling of negative numbers. Initializing result to 1 is incorrect if nums[0] is negative. Changing loop start without fixing initialization causes errors.Final Answer:
Initialize maxProd and minProd with nums[0] and start loop from i=1 -> Option AQuick Check:
Proper initialization and loop start fix bug [OK]
- Starting loop from 0 with maxProd=1
- Not swapping max and min on negative
- Wrong initialization of result
int arr[] = {-1, -3, -10, 0, 60};, what is the maximum product of any contiguous subarray?Solution
Step 1: Analyze subarrays and their products
Relevant products: [60]=60, [-3,-10]=30, [-1,-3]=3, [-1,-3,-10]=-30, [-10]=-10, subarrays crossing or including 0=0. No larger contiguous product exists (e.g. [-3,-10,60] skips 0, invalid).Final Answer:
60 -> Option CQuick Check:
Max product subarray = 60 [OK]
- Thinking non-contiguous subarrays like [-3,-10,60] are valid
- Choosing [-3,-10]=30 instead of 60
- Confusing zero as max product
Ready to prove it?
Pass the test and this pattern moves unknown
