Bird
Raised Fist0
DSA Cprogramming

Maximum Product Subarray in DSA C

Choose your learning style10 modes available
Mental Model
We want to find the largest product of a continuous part of the array. Because multiplying negatives can flip signs, we keep track of both the biggest and smallest products so far.
Analogy: Imagine walking on a path where stepping on a slippery stone (negative number) can flip your direction. To reach the farthest point (maximum product), you remember both your farthest forward and backward steps because a backward step might help you jump forward later.
Array: [2] -> [-3] -> [4] -> [-1] -> [0] -> [5]
Tracking max_prod and min_prod at each step
Dry Run Walkthrough
Input: array: [2, -3, 4, -1, 0, 5]
Goal: Find the maximum product of any continuous subarray
Step 1: Start with first element: max_prod = 2, min_prod = 2, result = 2
max_prod=2, min_prod=2, result=2
Why: Initialize tracking with first element to start comparisons
Step 2: Process -3: swap max_prod and min_prod because -3 is negative; max_prod = max(-3, 2 * -3) = -3; min_prod = min(-3, 2 * -3) = -6; result = max(2, -3) = 2
max_prod=-3, min_prod=-6, result=2
Why: Negative flips max and min, so swap to track correct values
Step 3: Process 4: max_prod = max(4, -3 * 4) = 4; min_prod = min(4, -6 * 4) = -24; result = max(2, 4) = 4
max_prod=4, min_prod=-24, result=4
Why: Positive number updates max and min normally
Step 4: Process -1: swap max_prod and min_prod; max_prod = max(-1, -24 * -1) = 24; min_prod = min(-1, 4 * -1) = -4; result = max(4, 24) = 24
max_prod=24, min_prod=-4, result=24
Why: Negative flips max and min again, potentially increasing max product
Step 5: Process 0: max_prod = max(0, 24 * 0) = 0; min_prod = min(0, -4 * 0) = 0; result = max(24, 0) = 24
max_prod=0, min_prod=0, result=24
Why: Zero resets product tracking
Step 6: Process 5: max_prod = max(5, 0 * 5) = 5; min_prod = min(5, 0 * 5) = 0; result = max(24, 5) = 24
max_prod=5, min_prod=0, result=24
Why: Positive number updates max product, but result remains max so far
Result:
Maximum product subarray = 24
Annotated Code
DSA C
#include <stdio.h>

int max(int a, int b) {
    return (a > b) ? a : b;
}

int min(int a, int b) {
    return (a < b) ? a : b;
}

int maxProduct(int* nums, int numsSize) {
    if (numsSize == 0) return 0;
    int max_prod = nums[0];
    int min_prod = nums[0];
    int result = nums[0];

    for (int i = 1; i < numsSize; i++) {
        if (nums[i] < 0) {
            int temp = max_prod;
            max_prod = min_prod;
            min_prod = temp;
        }
        max_prod = max(nums[i], max_prod * nums[i]);
        min_prod = min(nums[i], min_prod * nums[i]);
        if (max_prod > result) {
            result = max_prod;
        }
    }
    return result;
}

int main() {
    int nums[] = {2, -3, 4, -1, 0, 5};
    int size = sizeof(nums) / sizeof(nums[0]);
    int max_product = maxProduct(nums, size);
    printf("Maximum product subarray = %d\n", max_product);
    return 0;
}
if (nums[i] < 0) { int temp = max_prod; max_prod = min_prod; min_prod = temp; }
swap max and min product when current number is negative to handle sign flip
max_prod = max(nums[i], max_prod * nums[i]);
update max product ending at current index
min_prod = min(nums[i], min_prod * nums[i]);
update min product ending at current index
if (max_prod > result) { result = max_prod; }
update overall maximum product found so far
OutputSuccess
Maximum product subarray = 24
Complexity Analysis
Time: O(n) because we scan the array once, updating max and min products at each step
Space: O(1) because we use only a few variables to track products, no extra arrays
vs Alternative: Compared to checking all subarrays (O(n^2)), this approach is much faster and uses constant space
Edge Cases
empty array
returns 0 as no subarray exists
DSA C
if (numsSize == 0) return 0;
array with one element
returns that element as max product
DSA C
int max_prod = nums[0]; int min_prod = nums[0]; int result = nums[0];
array with zeros
resets product tracking to zero, allowing new subarray start
DSA C
max_prod = max(nums[i], max_prod * nums[i]); min_prod = min(nums[i], min_prod * nums[i]);
When to Use This Pattern
When asked for the maximum product of a continuous subarray, track both max and min products because negatives can flip signs and affect the result.
Common Mistakes
Mistake: Not swapping max and min products when encountering a negative number
Fix: Swap max and min before updating them when current number is negative
Mistake: Only tracking max product and ignoring min product
Fix: Track both max and min products to handle negative numbers correctly
Summary
Finds the maximum product of any continuous subarray in an array.
Use when you need the largest product from a sequence of numbers that can include negatives and zeros.
Keep track of both maximum and minimum products at each step because negatives can flip the sign and change the maximum.

Practice

(1/5)
1. What does the Maximum Product Subarray problem ask you to find in an array of integers?
easy
A. The subarray with the largest difference between elements
B. The contiguous subarray with the largest sum of its elements
C. The subarray with the smallest product of its elements
D. The contiguous subarray with the largest product of its elements

Solution

  1. 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.
  2. Final Answer:

    The contiguous subarray with the largest product of its elements -> Option D
  3. Quick Check:

    Maximum product subarray = largest product subarray [OK]
Hint: Focus on product, not sum, for this problem [OK]
Common Mistakes:
  • Confusing product with sum
  • Ignoring negative numbers impact
  • Thinking subarray can be non-contiguous
2. Which of the following is the correct way to declare variables to track the maximum and minimum products at each step in C for the Maximum Product Subarray problem?
easy
A. int maxProd = 1, minProd = 1;
B. int maxProd, minProd = 0;
C. int maxProd = 0, minProd = 0;
D. int maxProd = -1, minProd = -1;

Solution

  1. 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.
  2. Final Answer:

    int maxProd = 1, minProd = 1; -> Option A
  3. Quick Check:

    Initialize maxProd and minProd to 1 [OK]
Hint: Start max and min product as 1 to avoid zero multiplication [OK]
Common Mistakes:
  • Initializing maxProd or minProd to 0
  • Not initializing both variables
  • Using negative initial values
3. What is the output of the following C code snippet for the array 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;
}
medium
A. 4
B. 6
C. -2
D. 24

Solution

  1. 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].
  2. Final Answer:

    6 -> Option B
  3. Quick Check:

    Max product subarray = 6 [OK]
Hint: Swap max and min when negative number encountered [OK]
Common Mistakes:
  • Not swapping max and min on negative number
  • Confusing max product with sum
  • Incorrectly updating result
4. Identify the bug in the following C code snippet for Maximum Product Subarray and select the correct fix:
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;
}
medium
A. Initialize maxProd and minProd with nums[0] and start loop from i=1
B. Remove the swap of maxProd and minProd when nums[i] < 0
C. Initialize result to 1 instead of nums[0]
D. Change the loop to run from i=1 to numsSize-1 without other changes

Solution

  1. 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.
  2. Final Answer:

    Initialize maxProd and minProd with nums[0] and start loop from i=1 -> Option A
  3. Quick Check:

    Proper initialization and loop start fix bug [OK]
Hint: Initialize with first element, loop from second element [OK]
Common Mistakes:
  • Starting loop from 0 with maxProd=1
  • Not swapping max and min on negative
  • Wrong initialization of result
5. Given the array int arr[] = {-1, -3, -10, 0, 60};, what is the maximum product of any contiguous subarray?
hard
A. 1800
B. 0
C. 60
D. -1

Solution

  1. 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).
  2. Final Answer:

    60 -> Option C
  3. Quick Check:

    Max product subarray = 60 [OK]
Hint: Check negative pairs and zeros carefully [OK]
Common Mistakes:
  • Thinking non-contiguous subarrays like [-3,-10,60] are valid
  • Choosing [-3,-10]=30 instead of 60
  • Confusing zero as max product
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard