Finding Maximum Product Sub-array in a Given Array in C
Understanding Maximum Product Sub-array
This task involves finding the contiguous sub-array that has the maximum product.
We will explore three different methods to achieve this in C.
Method 1: Using Brute Force
This method calculates the product of all possible sub-arrays and finds the maximum.
#include <stdio.h> #include <limits.h> void max_product_subarray(int arr[], int n) { int max_product = INT_MIN; for (int i = 0; i < n; i++) { int product = 1; for (int j = i; j < n; j++) { product *= arr[j]; if (product > max_product) max_product = product; } } printf("Maximum Product: %d\n", max_product); } int main() { int arr[] = {2, 3, -2, 4}; int n = sizeof(arr) / sizeof(arr[0]); max_product_subarray(arr, n); return 0; }
Maximum Product: 6
Method 2: Using Dynamic Programming (Kadane's Variation)
This method keeps track of the maximum and minimum products at each step.
#include <stdio.h> #include <limits.h> void max_product_subarray(int arr[], int n) { int max_product = arr[0], min_product = arr[0], result = arr[0]; for (int i = 1; i < n; i++) { int temp = max_product; max_product = (arr[i] > arr[i] * max_product) ? (arr[i] > arr[i] * min_product ? arr[i] : arr[i] * min_product) : arr[i] * max_product; min_product = (arr[i] < arr[i] * temp) ? (arr[i] < arr[i] * min_product ? arr[i] : arr[i] * min_product) : arr[i] * temp; if (max_product > result) result = max_product; } printf("Maximum Product: %d\n", result); } int main() { int arr[] = {2, 3, -2, 4}; int n = sizeof(arr) / sizeof(arr[0]); max_product_subarray(arr, n); return 0; }
Maximum Product: 6
Method 3: Using a Single Pass Approach
This method efficiently finds the maximum product sub-array using a single pass.
#include <stdio.h> #include <limits.h> void max_product_subarray(int arr[], int n) { int max_product = arr[0], min_product = arr[0], result = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < 0) { int temp = max_product; max_product = min_product; min_product = temp; } max_product = (arr[i] > arr[i] * max_product) ? arr[i] : arr[i] * max_product; min_product = (arr[i] < arr[i] * min_product) ? arr[i] : arr[i] * min_product; if (max_product > result) result = max_product; } printf("Maximum Product: %d\n", result); } int main() { int arr[] = {2, 3, -2, 4}; int n = sizeof(arr) / sizeof(arr[0]); max_product_subarray(arr, n); return 0; }
Maximum Product: 6