Maximum product subset of an array - GeeksforGeeks

18 Jun, 2021
Given an array a, we have to find maximum product possible with the subset of elements present in the array. The maximum product can be single element also.Examples: 
Input: a[] = { -1, -1, -2, 4, 3 }
Output: 24
Explanation : Maximum product will be ( -2 * -1 * 4 * 3 ) = 24

Input: a[] = { -1, 0 }
Output: 0
Explanation: 0(single element) is maximum product possible
 
Input: a[] = { 0, 0, 0 }
Output: 0
A simple solution is to generate all subsets, find product of every subset and return maximum product.A better solution is to use the below facts.
If there are even number of negative numbers and no zeros, result is simply product of allIf there are odd number of negative numbers and no zeros, result is product of all except the negative integer with the least absolute value.If there are zeros, result is product of all except these zeros with one exceptional case. The exceptional case is when there is one negative number and all other elements are 0. In this case, result is 0.
If there are even number of negative numbers and no zeros, result is simply product of all
If there are odd number of negative numbers and no zeros, result is product of all except the negative integer with the least absolute value.
If there are zeros, result is product of all except these zeros with one exceptional case. The exceptional case is when there is one negative number and all other elements are 0. In this case, result is 0.
Below is the implementation of the above approach: 
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find maximum product of// a subset.#include <bits/stdc++.h>using namespace std; int maxProductSubset(int a[], int n){    if (n == 1)        return a[0];     // Find count of negative numbers, count    // of zeros, negative number    // with least absolute value    // and product of non-zero numbers    int max_neg = INT_MIN;    int count_neg = 0, count_zero = 0;    int prod = 1;    for (int i = 0; i < n; i++) {         // If number is 0, we don't        // multiply it with product.        if (a[i] == 0) {            count_zero++;            continue;        }         // Count negatives and keep        // track of negative number        // with least absolute value        if (a[i] < 0) {            count_neg++;            max_neg = max(max_neg, a[i]);        }         prod = prod * a[i];    }     // If there are all zeros    if (count_zero == n)        return 0;     // If there are odd number of    // negative numbers    if (count_neg & 1) {         // Exceptional case: There is only        // negative and all other are zeros        if (count_neg == 1 &&            count_zero > 0 &&            count_zero + count_neg == n)            return 0;         // Otherwise result is product of        // all non-zeros divided by        //negative number with        // least absolute value        prod = prod / max_neg;    }     return prod;} // Driver Codeint main(){    int a[] = {  -1, -1, -2, 4, 3  };    int n = sizeof(a) / sizeof(a[0]);    cout << maxProductSubset(a, n);    return 0;}
// Java program to find maximum product of// a subset. class GFG {     static int maxProductSubset(int a[], int n) {        if (n == 1) {            return a[0];        }         // Find count of negative numbers, count        // of zeros, negative number        // with least absolute value        // and product of non-zero numbers        int max_neg = Integer.MIN_VALUE;        int count_neg = 0, count_zero = 0;        int prod = 1;        for (int i = 0; i < n; i++) {             // If number is 0, we don't            // multiply it with product.            if (a[i] == 0) {                count_zero++;                continue;            }             // Count negatives and keep            // track of negative number            // with least absolute value.            if (a[i] < 0) {                count_neg++;                max_neg = Math.max(max_neg, a[i]);            }             prod = prod * a[i];        }         // If there are all zeros        if (count_zero == n) {            return 0;        }         // If there are odd number of        // negative numbers        if (count_neg % 2 == 1) {             // Exceptional case: There is only            // negative and all other are zeros            if (count_neg == 1                    && count_zero > 0                    && count_zero + count_neg == n) {                return 0;            }             // Otherwise result is product of            // all non-zeros divided by            //negative number with            // least absolute value.            prod = prod / max_neg;        }         return prod;    }     // Driver Code    public static void main(String[] args) {        int a[] = {-1, -1, -2, 4, 3};        int n = a.length;        System.out.println(maxProductSubset(a, n));     }}/* This JAVA code is contributed by Rajput-Ji*/
# Python3 program to find maximum product# of a subset. def maxProductSubset(a, n):    if n == 1:        return a[0]     # Find count of negative numbers, count    # of zeros, negative number    # with least absolute value    # and product of non-zero numbers    max_neg = -999999999999    count_neg = 0    count_zero = 0    prod = 1    for i in range(n):         # If number is 0, we don't        # multiply it with product.        if a[i] == 0:            count_zero += 1            continue         # Count negatives and keep        # track of negative number        # with least absolute value.        if a[i] < 0:            count_neg += 1            max_neg = max(max_neg, a[i])         prod = prod * a[i]     # If there are all zeros    if count_zero == n:        return 0     # If there are odd number of    # negative numbers    if count_neg & 1:         # Exceptional case: There is only        # negative and all other are zeros        if (count_neg == 1 and count_zero > 0 and            count_zero + count_neg == n):            return 0         # Otherwise result is product of        # all non-zeros divided        # by negative number        # with least absolute value        prod = int(prod / max_neg)     return prod # Driver Codeif __name__ == '__main__':    a = [ -1, -1, -2, 4, 3 ]    n = len(a)    print(maxProductSubset(a, n)) # This code is contributed by PranchalK
// C# Java program to find maximum// product of a subset.using System;                     class GFG{ static int maxProductSubset(int []a,                            int n){    if (n == 1)    {        return a[0];    }     // Find count of negative numbers,    // count of zeros, negative number with    // least absolute value and product of    // non-zero numbers    int max_neg = int.MinValue;    int count_neg = 0, count_zero = 0;    int prod = 1;    for (int i = 0; i < n; i++)    {         // If number is 0, we don't        // multiply it with product.        if (a[i] == 0)        {            count_zero++;            continue;        }         // Count negatives and keep        // track of negative number with        // least absolute value.        if (a[i] < 0)        {            count_neg++;            max_neg = Math.Max(max_neg, a[i]);        }         prod = prod * a[i];    }     // If there are all zeros    if (count_zero == n)    {        return 0;    }     // If there are odd number of    // negative numbers    if (count_neg % 2 == 1)    {         // Exceptional case: There is only        // negative and all other are zeros        if (count_neg == 1 && count_zero > 0 &&            count_zero + count_neg == n)        {            return 0;        }         // Otherwise result is product of        // all non-zeros divided by negative        // number with least absolute value.        prod = prod / max_neg;    }     return prod;} // Driver codepublic static void Main(){    int []a = {-1, -1, -2, 4, 3};    int n = a.Length;    Console.Write(maxProductSubset(a, n));}} // This code is contributed by Rajput-Ji
<?php// PHP program to find maximum// product of a subset. function maxProductSubset($a, $n){    if ($n == 1)        return $a[0];     // Find count of negative numbers,    // count of zeros, negative number    // with least absolute value and product of    // non-zero numbers    $max_neg = PHP_INT_MIN;    $count_neg = 0; $count_zero = 0;    $prod = 1;    for ($i = 0; $i < $n; $i++)    {         // If number is 0, we don't        // multiply it with product.        if ($a[$i] == 0)        {            $count_zero++;            continue;        }         // Count negatives and keep        // track of negative number        // with least absolute value.        if ($a[$i] < 0)        {            $count_neg++;            $max_neg = max($max_neg, $a[$i]);        }         $prod = $prod * $a[$i];    }     // If there are all zeros    if ($count_zero == $n)        return 0;     // If there are odd number of    // negative numbers    if ($count_neg & 1)    {         // Exceptional case: There is only        // negative and all other are zeros        if ($count_neg == 1 &&            $count_zero > 0 &&            $count_zero + $count_neg == $n)            return 0;         // Otherwise result is product of        // all non-zeros divided by negative        // number with least absolute value.        $prod = $prod / $max_neg;    }     return $prod;} // Driver Code$a = array(-1, -1, -2, 4, 3 );$n = sizeof($a);echo maxProductSubset($a, $n); // This code is contributed// by Akanksha Rai?>
<script> // JavaScript program to find maximum// product of a subset. function maxProductSubset(a, n){    if (n == 1)        return a[0];     // Find count of negative numbers,    // count of zeros, negative number    // with least absolute value and product of    // non-zero numbers    let max_neg = Number.MIN_SAFE_INTEGER;    let count_neg = 0; count_zero = 0;    let prod = 1;    for (let i = 0; i < n; i++)    {         // If number is 0, we don't        // multiply it with product.        if (a[i] == 0)        {            count_zero++;            continue;        }         // Count negatives and keep        // track of negative number        // with least absolute value.        if (a[i] < 0)        {            count_neg++;            max_neg = Math.max(max_neg, a[i]);        }         prod = prod * a[i];    }     // If there are all zeros    if (count_zero == n)        return 0;     // If there are odd number of    // negative numbers    if (count_neg & 1)    {         // Exceptional case: There is only        // negative and all other are zeros        if (count_neg == 1 &&            count_zero > 0 &&            count_zero + count_neg == n)            return 0;         // Otherwise result is product of        // all non-zeros divided by negative        // number with least absolute value.        prod = prod / max_neg;    }     return prod;} // Driver Codelet a = [-1, -1, -2, 4, 3 ];let n = a.length;document.write(maxProductSubset(a, n)); // This code is contributed// by _saurabh_jaiswal </script>
24
Time Complexity: O(n) Auxiliary Space: O(1) 
Rajput-Ji
Akanksha_Rai
PranchalKatiyar
Himanshu Gupta 20
_saurabh_jaiswal
Arrays
Greedy
Technical Scripter
Arrays
Greedy
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Stack Data Structure (Introduction and Program)
Introduction to Arrays
Multidimensional Arrays in Java
Dijkstra's shortest path algorithm | Greedy Algo-7
Kruskal’s Minimum Spanning Tree Algorithm | Greedy Algo-2
Prim’s Minimum Spanning Tree (MST) | Greedy Algo-5
Write a program to print all permutations of a given string
Huffman Coding | Greedy Algo-3