Maximum Product Subarray | Set 3

12 May, 2021
Given an array A[] that contains both positive and negative integers, find the maximum product subarray.Examples :  
Input: A[] = { 6, -3, -10, 0, 2 }
Output: 180  // The subarray is {6, -3, -10}

Input: A[] = {-1, -3, -10, 0, 60 }
Output: 60  // The subarray is {60}

Input: A[] = { -2, -3, 0, -2, -40 }
Output: 80  // The subarray is {-2, -40}
 
The idea is to traverse array from left to right keeping two variables minVal and maxVal which represents the minimum and maximum product value till the ith index of the array. Now, if the ith element of the array is negative that means now the values of minVal and maxVal will be swapped as value of maxVal will become minimum by multiplying it with a negative number. Now, compare the minVal and maxVal. The value of minVal and maxVal depends on the current index element or the product of the current index element and the previous minVal and maxVal respectively.Below is the implementation of above approach:  
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find maximum product subarray#include <bits/stdc++.h>using namespace std; // Function to find maximum product subarrayint maxProduct(int* arr, int n){    // Variables to store maximum and minimum    // product till ith index.    int minVal = arr[0];    int maxVal = arr[0];     int maxProduct = arr[0];     for (int i = 1; i < n; i++) {         // When multiplied by -ve number,        // maxVal becomes minVal        // and minVal becomes maxVal.        if (arr[i] < 0)            swap(maxVal, minVal);         // maxVal and minVal stores the        // product of subarray ending at arr[i].        maxVal = max(arr[i], maxVal * arr[i]);        minVal = min(arr[i], minVal * arr[i]);         // Max Product of array.        maxProduct = max(maxProduct, maxVal);    }     // Return maximum product found in array.    return maxProduct;} // Driver Codeint main(){    int arr[] = { -1, -3, -10, 0, 60 };     int n = sizeof(arr) / sizeof(arr[0]);     cout << "Maximum Subarray product is "         << maxProduct(arr, n) << endl;     return 0;}
// Java program to find maximum product subarrayimport java.io.*; class GFG {     // Function to find maximum product subarray    static int maxProduct(int arr[], int n)    {                 // Variables to store maximum and minimum        // product till ith index.        int minVal = arr[0];        int maxVal = arr[0];             int maxProduct = arr[0];             for (int i = 1; i < n; i++)        {                 // When multiplied by -ve number,            // maxVal becomes minVal            // and minVal becomes maxVal.            if (arr[i] < 0)            {                int temp = maxVal;                maxVal = minVal;                minVal =temp;                         }                 // maxVal and minVal stores the            // product of subarray ending at arr[i].            maxVal = Math.max(arr[i], maxVal * arr[i]);            minVal = Math.min(arr[i], minVal * arr[i]);                 // Max Product of array.            maxProduct = Math.max(maxProduct, maxVal);        }             // Return maximum product found in array.        return maxProduct;    }         // Driver Code    public static void main (String[] args)    {        int arr[] = { -1, -3, -10, 0, 60 };        int n = arr.length;             System.out.println( "Maximum Subarray product is "                                    + maxProduct(arr, n));    }} // This code is contributed by anuj_67.
# Python 3 program to find maximum# product subarray # Function to find maximum# product subarraydef maxProduct(arr, n):         # Variables to store maximum and    # minimum product till ith index.    minVal = arr[0]    maxVal = arr[0]     maxProduct = arr[0]     for i in range(1, n, 1):                 # When multiplied by -ve number,        # maxVal becomes minVal        # and minVal becomes maxVal.        if (arr[i] < 0):            temp = maxVal            maxVal = minVal            minVal = temp                     # maxVal and minVal stores the        # product of subarray ending at arr[i].        maxVal = max(arr[i], maxVal * arr[i])        minVal = min(arr[i], minVal * arr[i])         # Max Product of array.        maxProduct = max(maxProduct, maxVal)     # Return maximum product    # found in array.    return maxProduct # Driver Codeif __name__ == '__main__':    arr = [-1, -3, -10, 0, 60]     n = len(arr)     print("Maximum Subarray product is",                     maxProduct(arr, n)) # This code is contributed by# Surendra_Gangwar
// C# program to find// maximum product subarrayusing System; class GFG{     // Function to find maximum    // product subarray    static int maxProduct(int []arr,                          int n)    {                 // Variables to store        // maximum and minimum        // product till ith index.        int minVal = arr[0];        int maxVal = arr[0];             int maxProduct = arr[0];             for (int i = 1; i < n; i++)        {                 // When multiplied by -ve            // number, maxVal becomes            // minVal and minVal            // becomes maxVal.            if (arr[i] < 0)            {                int temp = maxVal;                maxVal = minVal;                minVal = temp;                         }                 // maxVal and minVal stores            // the product of subarray            // ending at arr[i].            maxVal = Math.Max(arr[i],                              maxVal * arr[i]);            minVal = Math.Min(arr[i],                              minVal * arr[i]);                 // Max Product of array.            maxProduct = Math.Max(maxProduct,                                  maxVal);        }             // Return maximum product        // found in array.        return maxProduct;    }         // Driver Code    public static void Main ()    {        int []arr = {-1, -3, -10, 0, 60};        int n = arr.Length;             Console.WriteLine("Maximum Subarray " +                                "product is " +                           maxProduct(arr, n));    }} // This code is contributed by anuj_67.
<?php// PHP program to find maximum// product subarray // Function to find maximum// product subarrayfunction maxProduct(&$arr, $n){    // Variables to store maximum and    // minimum product till ith index.    $minVal = $arr[0];    $maxVal = $arr[0];     $maxProduct = $arr[0];     for ($i = 1; $i < $n; $i++)    {         // When multiplied by -ve number,        // maxVal becomes minVal        // and minVal becomes maxVal.        if ($arr[$i] < 0)        {            $temp = $maxVal;            $maxVal = $minVal;            $minVal = $temp;        }         // maxVal and minVal stores the        // product of subarray ending at arr[i].        $maxVal = max($arr[$i], $maxVal * $arr[$i]);        $minVal = min($arr[$i], $minVal * $arr[$i]);         // Max Product of array.        $maxProduct = max($maxProduct, $maxVal);    }     // Return maximum product found in array.    return $maxProduct;} // Driver Code$arr = array( -1, -3, -10, 0, 60 );$n = sizeof($arr);echo "Maximum Subarray product is " .         maxProduct($arr, $n) . "\n"; // This code is contributed by ita_c?>
<script>// Javascript program to find maximum product subarray         // Function to find maximum product subarray    function maxProduct(arr,n)    {        // Variables to store maximum and minimum        // product till ith index.        let minVal = arr[0];        let maxVal = arr[0];               let maxProduct = arr[0];               for (let i = 1; i < n; i++)        {                   // When multiplied by -ve number,            // maxVal becomes minVal            // and minVal becomes maxVal.            if (arr[i] < 0)            {                let temp = maxVal;                maxVal = minVal;                minVal =temp;                           }                   // maxVal and minVal stores the            // product of subarray ending at arr[i].            maxVal = Math.max(arr[i], maxVal * arr[i]);            minVal = Math.min(arr[i], minVal * arr[i]);                   // Max Product of array.            maxProduct = Math.max(maxProduct, maxVal);        }               // Return maximum product found in array.        return maxProduct;    }          // Driver Code    let arr=[ -1, -3, -10, 0, 60 ];    let n = arr.length;    document.write( "Maximum Subarray product is "                                    + maxProduct(arr, n));      // This code is contributed by rag2127</script>
Maximum Sub array product is 60
 
Time Complexity: O( n ) Auxiliary Space: O( 1 )Related Articles:  
Maximum Product Subarray | Set 1
Maximum Product Subarray | Set 2 (Using Two Traversals)
 
vt_m
ukasp
SURENDRA_GANGWAR
rag2127
Constructive Algorithms
subarray
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.