Given an array with both +ive and -ive integers, return a pair with the 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 of the maximum product. Below is the implementation of this simple solution.
C++
#include<bits/stdc++.h>
using namespace std;
void maxProduct( int arr[], int n)
{
if (n < 2)
{
cout << "No pairs exists\n" ;
return ;
}
int a = arr[0], b = arr[1];
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 << "}" ;
}
int main()
{
int arr[] = {1, 4, 3, 6, 7, 0};
int n = sizeof (arr)/ sizeof (arr[0]);
maxProduct(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG {
static void maxProduct( int arr[], int n)
{
if (n < 2 )
{
System.out.println( "No pairs exists" );
return ;
}
int a = arr[ 0 ], b = arr[ 1 ];
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 + "}" );
}
public static void main(String[] args)
{
int arr[] = { 1 , 4 , 3 , 6 , 7 , 0 };
int n = arr.length;
maxProduct(arr, n);
}
}
|
Python3
def maxProduct(arr, n):
if (n < 2 ):
print ( "No pairs exists" )
return
a = arr[ 0 ]; b = arr[ 1 ]
for i in range ( 0 , n):
for j in range (i + 1 , n):
if (arr[i] * arr[j] > a * b):
a = arr[i]; b = arr[j]
print ( "Max product pair is {" , a, "," , b, "}" ,
sep = "")
arr = [ 1 , 4 , 3 , 6 , 7 , 0 ]
n = len (arr)
maxProduct(arr, n)
|
C#
using System;
class GFG
{
static void maxProduct( int []arr, int n)
{
if (n < 2)
{
Console.Write( "No pairs exists" );
return ;
}
int a = arr[0], b = arr[1];
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];
}
Console.Write( "Max product pair is {" +
a + ", " + b + "}" );
}
public static void Main()
{
int []arr = {1, 4, 3, 6, 7, 0};
int n = arr.Length;
maxProduct(arr, n);
}
}
|
PHP
<?php
function maxProduct( $arr , $n )
{
if ( $n < 2)
{
echo "No pairs exists\n" ;
return ;
}
$a = $arr [0];
$b = $arr [1];
for ( $i = 0; $i < $n ; $i ++)
for ( $j = $i + 1; $j < $n ; $j ++)
{
if ( $arr [ $i ] * $arr [ $j ] > $a * $b )
{
$a = $arr [ $i ];
$b = $arr [ $j ];
}
}
echo "Max product pair is {" , $a , ", " ;
echo $b , "}" ;
}
$arr = array (1, 4, 3, 6, 7, 0);
$n = count ( $arr );
maxProduct( $arr , $n );
?>
|
Javascript
<script>
function maxProduct(arr, n)
{
if (n < 2)
{
document.write( "No pairs exists" + "<br>" );
return ;
}
let a = arr[0], b = arr[1];
for (let i=0; i<n; i++)
for (let j=i+1; j<n; j++)
if (arr[i]*arr[j] > a*b)
a = arr[i], b = arr[j];
document.write( "Max product pair is {" + a + ", "
+ b + "}" );
}
let arr = [1, 4, 3, 6, 7, 0];
let n = arr.length;
maxProduct(arr, n);
</script>
|
Output
Max product pair is {6, 7}
Time Complexity: O(n2)
Auxiliary Space: O(1)
Better Approach:
A Better Solution is to use sorting. Below are detailed steps.
- Sort input array in increasing order.
- If all elements are positive, then return the product of the last two numbers.
- Else return a maximum of products of the first two and last two numbers.
Thanks to Rahul Jain for suggesting this method.
C++14
#include<bits/stdc++.h>
using namespace std;
void maxProduct(vector< int >arr, int n)
{
sort(arr.begin(), arr.end());
int num1, num2;
int sum1 = arr[0] * arr[1];
int sum2 = arr[n - 1] * arr[n - 2];
if (sum1 > sum2)
{
num1 = arr[0];
num2 = arr[1];
}
else
{
num1 = arr[n - 2];
num2 = arr[n - 1];
}
cout << ( "Max product pair = " )
<< num1 << "," << num2;
}
int main()
{
vector< int >arr = { 1, 4, 3, 6, 7, 0 };
int n = arr.size();
maxProduct(arr, n);
}
|
Java
import java.util.*;
public class GFG {
static void maxProduct( int arr[], int n)
{
Arrays.sort(arr);
int num1, num2;
int sum1 = arr[ 0 ] * arr[ 1 ];
int sum2 = arr[n - 1 ] * arr[n - 2 ];
if (sum1 > sum2) {
num1 = arr[ 0 ];
num2 = arr[ 1 ];
}
else {
num1 = arr[n - 2 ];
num2 = arr[n - 1 ];
}
System.out.println( "Max product pair = " +
"{" + num1 + "," + num2 + "}" );
}
public static void main(String[] args)
{
int arr[] = { 1 , 4 , 3 , 6 , 7 , 0 };
int n = arr.length;
maxProduct(arr, n);
}
}
|
Python3
def maxProduct(arr, n):
arr.sort()
num1 = num2 = 0
sum1 = arr[ 0 ] * arr[ 1 ]
sum2 = arr[n - 1 ] * arr[n - 2 ]
if (sum1 > sum2):
num1 = arr[ 0 ]
num2 = arr[ 1 ]
else :
num1 = arr[n - 2 ]
num2 = arr[n - 1 ]
print ( "Max product pair = {" , num1, "," , num2, "}" , sep = "")
arr = [ 1 , 4 , 3 , 6 , 7 , 0 ]
n = len (arr)
maxProduct(arr, n)
|
C#
using System;
class GFG{
static void maxProduct( int []arr, int n)
{
Array.Sort(arr);
int num1, num2;
int sum1 = arr[0] * arr[1];
int sum2 = arr[n - 1] * arr[n - 2];
if (sum1 > sum2)
{
num1 = arr[0];
num2 = arr[1];
}
else
{
num1 = arr[n - 2];
num2 = arr[n - 1];
}
Console.Write( "Max product pair = " +
"{" + num1 + "," + num2 + "}" );
}
public static void Main(String[] args)
{
int []arr = { 1, 4, 3, 6, 7, 0 };
int n = arr.Length;
maxProduct(arr, n);
}
}
|
Javascript
<script>
function maxProduct(arr, n)
{
arr.sort( function (a, b){ return a - b});
let num1, num2;
let sum1 = arr[0] * arr[1];
let sum2 = arr[n - 1] * arr[n - 2];
if (sum1 > sum2)
{
num1 = arr[0];
num2 = arr[1];
}
else
{
num1 = arr[n - 2];
num2 = arr[n - 1];
}
document.write( "Max product pair = " +
"{" + num1 + "," + num2 + "}" );
}
let arr = [ 1, 4, 3, 6, 7, 0 ];
let n = arr.length;
maxProduct(arr, n);
</script>
|
Output
Max product pair = 6,7
Time Complexity: O(nlog n)
Auxiliary Space: O(1)
Efficient Approach:
An Efficient Solution can solve the above problem in a single traversal of the input array. The idea is to traverse the input array and keep track of the following four values.
- Maximum positive value
- Second maximum positive value
- Maximum negative value i.e., a negative value with maximum absolute value
- Second maximum negative value.
At the end of the loop, compare the products of the first two and last two and print the maximum of two products. Below is the implementation of this idea.
C++
#include<bits/stdc++.h>
using namespace std;
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 ;
}
int posa = INT_MIN, posb = INT_MIN;
int nega = INT_MIN, negb = INT_MIN;
for ( int i = 0; i < n; i++)
{
if (arr[i] > posa)
{
posb = posa;
posa = arr[i];
}
else if (arr[i] > posb)
posb = arr[i];
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 << "}" ;
}
int main()
{
int arr[] = {1, 4, 3, 6, 7, 0};
int n = sizeof (arr)/ sizeof (arr[0]);
maxProduct(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG {
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 ;
}
int posa = Integer.MIN_VALUE,
posb = Integer.MIN_VALUE;
int nega = Integer.MIN_VALUE,
negb = Integer.MIN_VALUE;
for ( int i = 0 ; i < n; i++)
{
if (arr[i] > posa)
{
posb = posa;
posa = arr[i];
}
else if (arr[i] > posb)
posb = arr[i];
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 + "}" );
}
public static void main(String[] args)
{
int arr[] = { 1 , 4 , 3 , 6 , 7 , 0 };
int n = arr.length;
maxProduct(arr, n);
}
}
|
Python3
def maxProduct(arr, n):
if (n < 2 ):
print ( "No pairs exists" )
return
if (n = = 2 ):
print (arr[ 0 ] , " " , arr[ 1 ])
return
posa = 0
posb = 0
nega = 0
negb = 0
for i in range (n):
if (arr[i] > posa):
posb = posa
posa = arr[i]
elif (arr[i] > posb):
posb = arr[i]
if (arr[i] < 0 and abs (arr[i]) > abs (nega)):
negb = nega
nega = arr[i]
elif (arr[i] < 0 and abs (arr[i]) > abs (negb)):
negb = arr[i]
if (nega * negb > posa * posb):
print ( "Max product pair is {" ,
nega , ", " , negb , "}" )
else :
print ( "Max product pair is {" ,
posa , ", " ,posb , "}" )
if __name__ = = "__main__" :
arr = [ 1 , 4 , 3 , 6 , 7 , 0 ]
n = len (arr)
maxProduct(arr, n)
|
C#
using System;
class GFG {
static void maxProduct( int []arr, int n)
{
if (n < 2)
{
Console.WriteLine( "No pairs exists" );
return ;
}
if (n == 2)
{
Console.WriteLine(arr[0] + " " + arr[1]);
return ;
}
int posa = int .MinValue;
int posb = int .MaxValue;
int nega = int .MinValue;
int negb = int .MaxValue;
for ( int i = 0; i < n; i++)
{
if (arr[i] > posa)
{
posb = posa;
posa = arr[i];
}
else if (arr[i] > posb)
posb = arr[i];
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)
Console.WriteLine( "Max product pair is {"
+ nega + ", " + negb + "}" );
else
Console.WriteLine( "Max product pair is {"
+ posa + ", " + posb + "}" );
}
public static void Main()
{
int []arr = {1, 4, 3, 6, 7, 0};
int n = arr.Length;
maxProduct(arr, n);
}
}
|
PHP
<?php
function maxProduct(& $arr , $n )
{
if ( $n < 2)
{
echo ( "No pairs exists\n" );
return ;
}
if ( $n == 2)
{
echo ( $arr [0]);
echo ( " " );
echo ( $arr [1]);
echo ( "\n" );
return ;
}
$posa = 0;
$posb = 0;
$nega = 0;
$negb = 0;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $arr [ $i ] > $posa )
{
$posb = $posa ;
$posa = $arr [ $i ];
}
else if ( $arr [ $i ] > $posb )
$posb = $arr [ $i ];
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 )
{
echo ( "Max product pair is {" );
echo $nega ;
echo ( ", " );
echo ( $negb );
echo ( "}" );
}
else
{
echo ( "Max product pair is {" );
echo $posa ;
echo ( ", " );
echo ( $posb );
echo ( "}" );
}
}
$arr = array (1, 4, 3, 6, 7, 0);
$n = sizeof( $arr );
maxProduct( $arr , $n );
?>
|
Javascript
<script>
function maxProduct(arr,n)
{
if (n < 2)
{
document.write( "No pairs exists" );
return ;
}
if (n == 2)
{
document.write(arr[0] + " " + arr[1]);
return ;
}
let posa = Number.MIN_VALUE,
posb = Number.MIN_VALUE;
let nega = Number.MIN_VALUE,
negb = Number.MIN_VALUE;
for (let i = 0; i < n; i++)
{
if (arr[i] > posa)
{
posb = posa;
posa = arr[i];
}
else if (arr[i] > posb)
posb = arr[i];
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)
document.write( "Max product pair is {"
+ nega + ", " + negb + "}" );
else
document.write( "Max product pair is {"
+ posa + ", " + posb + "}" );
}
let arr=[1, 4, 3, 6, 7, 0];
let n = arr.length;
maxProduct(arr, n);
</script>
|
Output
Max product pair is {7, 6}
Time complexity: O(n)
Auxiliary Space: O(1)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!