Related Articles

# Find a pair in Array with second largest product

• Last Updated : 10 May, 2021

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++

 `// C++ program for the above approach``#include ``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 > > s;` `    ``// Declaring vector of pairs``    ``vector > 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);` `    ``// Function Call``    ``secondLargerstPair(arr, N);``    ``return` `0;``}`
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++

 `// C++ program for the above approach``#include ``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, b = arr;``    ``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);` `    ``// Function Call``    ``maxProduct(arr, N);``    ``return` `0;``}`

## Java

 `// 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`

## Python3

 `# 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`

## C#

 `// 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, b = arr;``    ``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`

## Javascript

 ``
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++

 `// C++ program for the above approach``#include ``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;``    ``int` `smallest3 = arr;` `    ``// 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);` `    ``// Function Call``    ``maxProduct(arr, N);``    ``return` `0;``}`

## Java

 `// 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`

## Python3

 `# 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`

## C#

 `// 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;``    ``int` `smallest3 = arr;` `    ``// 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`

## Javascript

 ``
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.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up