Find a pair in Array with second largest product

Given an array arr[] of N integers, where N > 2, the task is to find the second largest product pair from the given array.

Examples:

Input: arr[] = {10, 20, 12, 40, 50}
Output: 20 50
Explanation:
A pair of array elements = [(10, 20), (10, 12), (10, 40), (10, 50), (20, 12), (20, 40), (20, 50), (12, 40), (12, 50), (40, 50)]
If do product of each pair will get the largest pair as (40, 50) and second largest pair (20, 50)

Input: arr[] = {5, 2, 67, 45, 160, 78}
Output: 67 160

Naive Approach: The naive approach is to generate all possible pairs from the given array and insert the product with the pair into the set of pairs. After inserting all the pair products in the set print the second last product of the set. Below are the steps:



  1. Make a set of pairs and their products by the given array.
  2. Insert all the pairs in vector of pairs.
  3. If vector size is 1 then print this pair otherwise print the pair at (total vector size – 2)th position of vector.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to find second largest
// product of pairs
void secondLargerstPair(int arr[], int N)
{
  
    // If size of array is less then 3
    // then second largest product pair
    // dose not exits.
    if (N < 3)
        return;
  
    // Declaring set of pairs which
    // contains possible pairs of array
    // and their products
    set<pair<int, pair<int, int> > > s;
  
    // Declaring vector of pairs
    vector<pair<int, int> > v;
  
    for (int i = 0; i < N; ++i) {
  
        for (int j = i + 1; j < N; ++j) {
  
            // Inserting a set
            s.insert(make_pair(arr[i] * arr[j],
                               make_pair(arr[i],
                                         arr[j])));
        }
    }
  
    // Traverse set of pairs
    for (auto i : s) {
  
        // Inserting values in vector
        // of pairs
        v.push_back(
            make_pair((i.second).first,
                      (i.second).second));
    }
  
    int vsize = v.size();
  
    // Printing the result
    cout << v[vsize - 2].first << " "
         << v[vsize - 2].second << endl;
}
  
// Driver Code
int main()
{
    // Given Array
    int arr[] = { 5, 2, 67, 45, 160, 78 };
  
    // Size of Array
    int N = sizeof(arr) / sizeof(arr[0]);
  
    // Function Call
    secondLargerstPair(arr, N);
    return 0;
}

chevron_right


Output: 

67 160

Time Complexity: O(N2
Auxiliary Space: O(N)

Better Solution: A better solution is to traverse all the pairs of the array and while traversing store the largest and second-largest product pairs. After traversal print the pairs with second-largest pairs stored.
 

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to find second largest
// product pair in arr[0..n-1]
void maxProduct(int arr[], int N)
{
    // No pair exits
    if (N < 3) {
        return;
    }
  
    // Initialize max product pair
    int a = arr[0], b = arr[1];
    int c = 0, d = 0;
  
    // Traverse through every possible pair
    // and keep track of largest product
    for (int i = 0; i < N; i++)
        for (int j = i + 1; j < N; j++) {
  
            // If pair is largest
            if (arr[i] * arr[j] > a * b) {
  
                // Second largest
                c = a, d = b;
                a = arr[i], b = arr[j];
            }
  
            // If pair dose not largest but
            // larger then second largest
            if (arr[i] * arr[j] < a * b
                && arr[i] * arr[j] > c * d)
                c = arr[i], d = arr[j];
        }
  
    // Print the pairs
    cout << c << " " << d;
}
  
// Driver Code
int main()
{
    // Given array
    int arr[] = { 5, 2, 67, 45, 160, 78 };
    int N = sizeof(arr) / sizeof(arr[0]);
  
    // Function Call
    maxProduct(arr, N);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach
class GFG{ 
    
// Function to find second largest
// product pair in arr[0..n-1]
static void maxProduct(int arr[], int N)
{
    // No pair exits
    if (N < 3)
    {
        return;
    }
   
    // Initialize max product pair
    int a = arr[0], b = arr[1];
    int c = 0, d = 0;
   
    // Traverse through every possible pair
    // and keep track of largest product
    for (int i = 0; i < N; i++)
        for (int j = i + 1; j < N-1; j++) 
        {
   
            // If pair is largest
            if (arr[i] * arr[j] > a * b) 
            {
   
                // Second largest
                c = a;
                d = b;
                a = arr[i];
                b = arr[j];
            }
   
            // If pair dose not largest but
            // larger then second largest
            if (arr[i] * arr[j] < a * b && 
                arr[i] * arr[j] > c * d)
                c = arr[i];
                d = arr[j];
        }
   
    // Print the pairs
    System.out.println(c + " " + d);
}
   
// Driver Code
public static void main(String[] args)
{
    // Given array
    int arr[] = { 5, 2, 67, 45, 160, 78 };
    int N = arr.length;
   
    // Function Call
    maxProduct(arr, N);
}
}
  
// This code is contributed by Ritik Bansal

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for the above approach
  
# Function to find second largest
# product pair in arr[0..n-1]
def maxProduct(arr, N):
      
    # No pair exits
    if (N < 3):
        return;
      
    # Initialize max product pair
    a = arr[0]; b = arr[1];
    c = 0; d = 0;
  
    # Traverse through every possible pair
    # and keep track of largest product
    for i in range(0, N, 1):
        for j in range(i + 1, N - 1, 1):
  
            # If pair is largest
            if (arr[i] * arr[j] > a * b):
  
                # Second largest
                c = a;
                d = b;
                a = arr[i];
                b = arr[j];
              
            # If pair dose not largest but
            # larger then second largest
            if (arr[i] * arr[j] < a * b and
                arr[i] * arr[j] > c * d):
                c = arr[i];
                  
            d = arr[j];
          
    # Print the pairs
    print(c, " ", d);
  
# Driver Code
if __name__ == '__main__':
      
    # Given array
    arr = [ 5, 2, 67, 45, 160, 78];
    N = len(arr);
  
    # Function call
    maxProduct(arr, N);
  
# This code is contributed by Amit Katiyar 

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for the above approach
using System;
  
class GFG{ 
  
// Function to find second largest
// product pair in arr[0..n-1]
static void maxProduct(int []arr, int N)
{
      
    // No pair exits
    if (N < 3)
    {
        return;
    }
  
    // Initialize max product pair
    int a = arr[0], b = arr[1];
    int c = 0, d = 0;
  
    // Traverse through every possible pair
    // and keep track of largest product
    for(int i = 0; i < N; i++)
        for(int j = i + 1; j < N - 1; j++) 
        {
              
            // If pair is largest
            if (arr[i] * arr[j] > a * b) 
            {
  
                // Second largest
                c = a;
                d = b;
                a = arr[i];
                b = arr[j];
            }
  
            // If pair dose not largest but
            // larger then second largest
            if (arr[i] * arr[j] < a * b && 
                arr[i] * arr[j] > c * d)
                c = arr[i];
                d = arr[j];
        }
  
    // Print the pairs
    Console.WriteLine(c + " " + d);
}
  
// Driver Code
public static void Main(String[] args)
{
      
    // Given array
    int []arr = { 5, 2, 67, 45, 160, 78 };
    int N = arr.Length;
  
    // Function call
    maxProduct(arr, N);
}
}
  
// This code is contributed by 29AjayKumar

chevron_right


Output: 

67 160

Time Complexity: O(N2
Auxiliary Space: O(N) 

Efficient Approach:

  1. Sort the array.
  2. Find first and third smallest elements for handling negative numbers.
  3. Find the first and third largest elements for handling positive numbers.
  4. Compare the product of the smallest pair and largest pair.
  5. Return the largest one of them.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to find second largest
// product pair in arr[0..n-1]
void maxProduct(int arr[], int N)
{
    // No pair exits
    if (N < 3) {
        return;
    }
  
    // Sort the array
    sort(arr, arr + N);
  
    // Initialize smallest element
    // of the array
    int smallest1 = arr[0];
    int smallest3 = arr[2];
  
    // Initialize largest element
    // of the array
    int largest1 = arr[N - 1];
    int largest3 = arr[N - 3];
  
    // Print second largest product pair
    if (smallest1 * smallest3
        >= largest1 * largest3) {
        cout << smallest1 << " " << smallest3;
    }
    else {
        cout << largest1 << " " << largest3;
    }
}
  
// Driver Code
int main()
{
    // Given array
    int arr[] = { 5, 2, 67, 45, 160, 78 };
  
    int N = sizeof(arr) / sizeof(arr[0]);
  
    // Function Call
    maxProduct(arr, N);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach
import java.util.*;
class GFG{
  
// Function to find second largest
// product pair in arr[0..n-1]
static void maxProduct(int arr[], int N)
{
    // No pair exits
    if (N < 3
    {
        return;
    }
  
    // Sort the array
    Arrays.sort(arr);
  
    // Initialize smallest element
    // of the array
    int smallest1 = arr[0];
    int smallest3 = arr[2];
  
    // Initialize largest element
    // of the array
    int largest1 = arr[N - 1];
    int largest3 = arr[N - 3];
  
    // Print second largest product pair
    if (smallest1 * smallest3 >= 
        largest1 * largest3) 
    {
        System.out.print(smallest1 + " "
                         smallest3);
    }
    else 
    {
        System.out.print(largest1 + " " +  
                         largest3);
    }
}
  
// Driver Code
public static void main(String[] args)
{
    // Given array
    int arr[] = { 5, 2, 67, 45, 160, 78 };
  
    int N = arr.length;
  
    // Function Call
    maxProduct(arr, N);
}
}
  
// This code is contributed by gauravrajput1

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for the above approach
  
# Function to find second largest
# product pair in arr[0..n-1]
def maxProduct(arr, N):
    
    # No pair exits
    if (N < 3):
        return;
  
    # Sort the array
    arr.sort();
  
    # Initialize smallest element
    # of the array
    smallest1 = arr[0];
    smallest3 = arr[2];
  
    # Initialize largest element
    # of the array
    largest1 = arr[N - 1];
    largest3 = arr[N - 3];
  
    # Prsecond largest product pair
    if (smallest1 * 
        smallest3 >= largest1 * 
                     largest3):
        print(smallest1 , " " , smallest3);
    else:
        print(largest1 , " " , largest3);
  
# Driver Code
if __name__ == '__main__':
    
    # Given array
    arr = [5, 2, 67, 45, 160, 78];
  
    N = len(arr);
  
    # Function Call
    maxProduct(arr, N);
  
# This code is contributed by sapnasingh4991

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for the above approach
using System;
class GFG{
  
// Function to find second largest
// product pair in arr[0..n-1]
static void maxProduct(int []arr, int N)
{
    // No pair exits
    if (N < 3) 
    {
        return;
    }
  
    // Sort the array
    Array.Sort(arr);
  
    // Initialize smallest element
    // of the array
    int smallest1 = arr[0];
    int smallest3 = arr[2];
  
    // Initialize largest element
    // of the array
    int largest1 = arr[N - 1];
    int largest3 = arr[N - 3];
  
    // Print second largest product pair
    if (smallest1 * smallest3 >= 
        largest1 * largest3) 
    {
        Console.Write(smallest1 + " "
                      smallest3);
    }
    else 
    {
        Console.Write(largest1 + " " +  
                      largest3);
    }
}
  
// Driver Code
public static void Main(String[] args)
{
    // Given array
    int []arr = { 5, 2, 67, 45, 160, 78 };
  
    int N = arr.Length;
  
    // Function Call
    maxProduct(arr, N);
}
}
  
// This code is contributed by Rohit_ranjan

chevron_right


Output: 

160 67

Time Complexity: O(N*log N) 
Auxiliary Space: O(1)
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.