Open In App

Find a subset with greatest geometric mean

Improve
Improve
Like Article
Like
Save
Share
Report

Given an array of positive integers, the task is that we find a subset of size greater than one with maximum product.

Input  : arr[] = {1, 5, 7, 2, 0};    
Output : 5 7
The subset containing 5 and 7 produces maximum
geometric mean

Input  : arr[] = { 4, 3 , 5 , 9 , 8 };
Output : 8 9

A Naive Approach is to run two loops and check one-by-one array elements which give greatest geometric mean (G.M). Time complexity of this solution is O(n*n) and this solution also causes overflow.

An Efficient Solution is based on the fact that the greatest two elements would always produce the greatest mean as the question requires finding a subset of size greater than one. 

Implementation:

C++




// C++ program to find a subset of size 2 or
// greater with greatest geometric mean. This
// program basically find largest two elements.
#include <bits/stdc++.h>
using namespace std;
 
void findLargestGM(int arr[], int n)
{
    /* There should be atleast two elements */
    if (n < 2)
    {
        printf(" Invalid Input ");
        return;
    }
 
    int first = INT_MIN, second = INT_MIN;
    for (int i = 0; i < n ; i ++)
    {
        /* If current element is smaller than first
           then update both first and second */
        if (arr[i] > first)
        {
            second = first;
            first = arr[i];
        }
 
        /* If arr[i] is in between first and second
           then update second  */
        else if (arr[i] > second)
            second = arr[i];
    }
 
    printf("%d %d", second, first);
}
 
/* Driver program to test above function */
int main()
{
    int arr[] = {12, 13, 17, 10, 34, 1};
    int n = sizeof(arr)/sizeof(arr[0]);
    findLargestGM(arr, n);
    return 0;
}


Java




// Java program to find a subset of size 2 or
// greater with greatest geometric mean. This
// program basically find largest two elements.
 
class GFG {
     
    static void findLargestGM(int arr[], int n)
    {
         
        // There should be atleast two elements
        if (n < 2)
        {
            System.out.print(" Invalid Input ");
        }
     
        int first = -2147483648, second = -2147483648;
         
        for (int i = 0; i < n ; i ++)
        {
             
            /* If current element is smaller than first
            then update both first and second */
            if (arr[i] > first)
            {
                second = first;
                first = arr[i];
            }
     
            /* If arr[i] is in between first and second
            then update second */
            else if (arr[i] > second)
                second = arr[i];
        }
     
        System.out.print(second + " " + first);
    }
     
    // Driver function
    public static void main(String arg[])
    {
        int arr[] = {12, 13, 17, 10, 34, 1};
        int n = arr.length;
         
        findLargestGM(arr, n);
    }
}
 
// This code is contributed by Anant Agarwal.


Python3




# Python3 program to find
# a subset of size 2 or
# greater with greatest
# geometric mean. This
# program basically find
# largest two elements.
 
import sys
def findLargestGM(arr, n):
 
        # There should be
        # atleast two elements
    if n < 2:
        print (" Invalid Input ")
        return
 
    first = -sys.maxsize - 1
    second = -sys.maxsize - 1
    for i in range(0,n):
         
        # If current element is
        # smaller than first
        # then update both first
        # and second
        if arr[i] > first:
            second = first
            first = arr[i]
 
        # If arr[i] is in between
        # first and second
        # then update second
        else if arr[i] > second:
            second = arr[i]
 
    print ("%d %d"%(second, first))
 
# Driver program to
# test above function
arr = [12, 13, 17, 10, 34, 1]
n = len(arr)
 
findLargestGM(arr, n)
 
# This code is contributed
# by Shreyanshi Arun.


C#




// C# program to find a subset of size 2 or
// greater with greatest geometric mean. This
// program basically find largest two elements.
using System;
 
class GFG {
     
    static void findLargestGM(int []arr, int n)
    {
         
        // There should be atleast two elements
        if (n < 2)
        {
            Console.Write("Invalid Input");
        }
     
        int first = -2147483648;
        int second = -2147483648;
         
        for (int i = 0; i < n ; i ++)
        {
             
            // If current element is smaller
            // than first then update both
            // first and second
            if (arr[i] > first)
            {
                second = first;
                first = arr[i];
            }
     
            // If arr[i] is in between first
            // and second then update second
            else if (arr[i] > second)
                second = arr[i];
        }
     
        Console.Write(second + " " + first);
    }
     
    // Driver code
    public static void Main()
    {
        int []arr = {12, 13, 17, 10, 34, 1};
        int n = arr.Length;
         
        findLargestGM(arr, n);
    }
}
 
// This code is contributed by Nitin Mittal.


PHP




<?php
// PHP program to find a subset of size 2 or
// greater with greatest geometric mean. This
// program basically find largest two elements.
 
function findLargestGM($arr, $n)
{
    /* There should be atleast two elements */
    if ($n < 2)
    {
        echo(" Invalid Input ");
        return;
    }
 
    $first = PHP_INT_MIN; $second = PHP_INT_MIN;
    for ($i = 0; $i < $n ; $i++)
    {
        /* If current element is smaller than first
        then update both first and second */
        if ($arr[$i] > $first)
        {
            $second = $first;
            $first = $arr[$i];
        }
 
        /* If arr[i] is in between first and second
        then update second */
        else if ($arr[$i] > $second)
            $second = $arr[$i];
    }
 
    echo($second . " " . $first);
}
 
/* Driver program to test above function */
$arr = array(12, 13, 17, 10, 34, 1);
$n = sizeof($arr);
findLargestGM($arr, $n);
 
// This code is contributed by Ajit.
?>


Javascript




<script>
 
// Javascript program to find a subset of size 2 or
// greater with greatest geometric mean. This
// program basically find largest two elements.
function findLargestGM(arr, n)
{
     
    // There should be atleast two elements
    if (n < 2)
    {
        document.write("Invalid Input");
    }
   
    let first = -2147483648;
    let second = -2147483648;
       
    for(let i = 0; i < n ; i ++)
    {
         
        // If current element is smaller
        // than first then update both
        // first and second
        if (arr[i] > first)
        {
            second = first;
            first = arr[i];
        }
   
        // If arr[i] is in between first
        // and second then update second
        else if (arr[i] > second)
            second = arr[i];
    }
    document.write(second + " " + first);
}
 
// Driver code
let arr = [ 12, 13, 17, 10, 34, 1 ];
let n = arr.length;
 
findLargestGM(arr, n);
 
// This code is contribute by divyesh072019
 
</script>


Output

17 34

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

 



Last Updated : 07 Jul, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads