Find a pair with maximum product in array of Integers

2.4

Given an array with both +ive and -ive integers, return a pair with highest product.

Examples:

Input: arr[] = {1, 4, 3, 6, 7, 0}  
Output: {6,7}  

Input: arr[] = {-1, -3, -4, 2, 0, -5} 
Output: {-4,-5} 

A Simple Solution is to consider every pair and keep track maximum product. Below is the implementation of this simple solution.

C++

// A simple C++ program to find max product pair in
// an array of integers
#include<bits/stdc++.h>
using namespace std;

// Function to find maximum product pair in arr[0..n-1]
void maxProduct(int arr[], int n)
{
    if (n < 2)
    {
        cout << "No pairs exists\n";
        return;
    }

    // Initialize max product pair
    int a = arr[0], b = arr[1];

    // Traverse through every possible pair
    // and keep track of max product
    for (int i=0; i<n; i++)
      for (int j=i+1; j<n; j++)
         if (arr[i]*arr[j] > a*b)
            a = arr[i], b = arr[j];

    cout << "Max product pair is {" << a << ", "
         << b << "}";
}

// Driver program to test
int main()
{
    int arr[] = {1, 4, 3, 6, 7, 0};
    int n = sizeof(arr)/sizeof(arr[0]);
    maxProduct(arr, n);
    return 0;
}

Java

// JAVA Code to Find a pair with maximum
// product in array of Integers
import java.util.*;

class GFG {
    
    // Function to find maximum product pair
    // in arr[0..n-1]
    static void maxProduct(int arr[], int n)
    {
        if (n < 2)
        {
            System.out.println("No pairs exists");
            return;
        }
     
        // Initialize max product pair
        int a = arr[0], b = arr[1];
     
        // Traverse through every possible pair
        // and keep track of max product
        for (int i = 0; i < n; i++)
          for (int j = i + 1; j < n; j++)
             if (arr[i] * arr[j] > a * b){
                a = arr[i]; 
                b = arr[j];
             }
             
        System.out.println("Max product pair is {" +
                           a + ", " + b + "}");
    }
    
    /* Driver program to test above function */
    public static void main(String[] args) 
    {
        int arr[] = {1, 4, 3, 6, 7, 0};
        int n = arr.length;
        maxProduct(arr, n);
            
    }
}

// This code is contributed by Arnav Kr. Mandal.


Output:
Max product pair is {6, 7}

Time Complexity: O(n2)

A Better Solution is to use sorting. Below are detailed steps.
1) Sort input array in increasing order.
2) If all elements are positive, then return product of last two numbers.
3) Else return maximum of products of first two and last two numbers.
Time complexity of this solution is O(nLog n). Thanks to Rahul Jain for suggesting this method.

An Efficient Solution can solve the above problem in single traversal of input array. The idea is to traverse the input array and keep track of following four values.
a) Maximum positive value
b) Second maximum positive value
c) Maximum negative value i.e., a negative value with maximum absolute value
d) Second maximum negative value.
At the end of the loop, compare the products of first two and last two and print the maximum of two products. Below is the implementation of this idea.

C++

// A O(n) C++ program to find maximum product pair in an array
#include<bits/stdc++.h>
using namespace std;

// Function to find maximum product pair in arr[0..n-1]
void maxProduct(int arr[], int n)
{
    if (n < 2)
    {
        cout << "No pairs exists\n";
        return;
    }

    if (n == 2)
    {
        cout << arr[0] << " " << arr[1] << endl;
        return;
    }

    // Iniitialize maximum and second maximum
    int posa = INT_MIN, posb = INT_MIN;

    // Iniitialize minimum and second minimum
    int nega = INT_MIN, negb = INT_MIN;

    // Traverse given array
    for (int i = 0; i < n; i++)
    {
        // Update maximum and second maximum if needed
        if (arr[i] > posa)
        {
            posb = posa;
            posa = arr[i];
        }
        else if (arr[i] > posb)
            posb = arr[i];

        // Update minimum and second minimum if needed
        if (arr[i] < 0 && abs(arr[i]) > abs(nega))
        {
            negb = nega;
            nega = arr[i];
        }
        else if(arr[i] < 0 && abs(arr[i]) > abs(negb))
            negb = arr[i];
    }

    if (nega*negb > posa*posb)
        cout << "Max product pair is {" << nega << ", "
             << negb << "}";
    else
        cout << "Max product pair is {" << posa << ", "
             << posb << "}";
}

// Driver program to test above function
int main()
{
    int arr[] = {1, 4, 3, 6, 7, 0};
    int n = sizeof(arr)/sizeof(arr[0]);
    maxProduct(arr, n);
    return 0;
}

Java

// JAVA Code to Find a pair with maximum 
// product in array of Integers
import java.util.*;

class GFG {
    
    // Function to find maximum product pair
    // in arr[0..n-1]
    static void maxProduct(int arr[], int n)
    {
        if (n < 2)
        {
            System.out.println("No pairs exists");
            return;
        }
     
        if (n == 2)
        {
            System.out.println(arr[0] + " " + arr[1]);
            return;
        }
     
        // Iniitialize maximum and second maximum
        int posa = Integer.MIN_VALUE,
            posb = Integer.MIN_VALUE;
     
        // Iniitialize minimum and second minimum
        int nega = Integer.MIN_VALUE, 
            negb = Integer.MIN_VALUE;
     
        // Traverse given array
        for (int i = 0; i < n; i++)
        {
            // Update maximum and second maximum
            // if needed
            if (arr[i] > posa)
            {
                posb = posa;
                posa = arr[i];
            }
            else if (arr[i] > posb)
                posb = arr[i];
     
            // Update minimum and second minimum 
            // if needed
            if (arr[i] < 0 && Math.abs(arr[i]) >
                       Math.abs(nega))
            {
                negb = nega;
                nega = arr[i];
            }
            else if(arr[i] < 0 && Math.abs(arr[i]) 
                       > Math.abs(negb))
                negb = arr[i];
        }
     
        if (nega * negb > posa * posb)
            System.out.println("Max product pair is {" 
                          + nega + ", " + negb + "}");
        else
            System.out.println("Max product pair is {" 
                          + posa + ", " + posb + "}");
    }
    
    /* Driver program to test above function */
    public static void main(String[] args) 
    {
        int arr[] = {1, 4, 3, 6, 7, 0};
        int n = arr.length;
        maxProduct(arr, n);
            
    }
}

// This code is contributed by Arnav Kr. Mandal.    


Output:
Max product pair is {7, 6}

Time complexity: O(n)
Auxiliary Space: O(1)

Thanks to Gaurav Ahirwar for suggesting this method.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above

GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.

Recommended Posts:



2.4 Average Difficulty : 2.4/5.0
Based on 33 vote(s)










Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.