Find a subset with greatest geometric mean
Last Updated :
07 Jul, 2022
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++
#include <bits/stdc++.h>
using namespace std;
void findLargestGM( int arr[], int n)
{
if (n < 2)
{
printf ( " Invalid Input " );
return ;
}
int first = INT_MIN, second = INT_MIN;
for ( int i = 0; i < n ; i ++)
{
if (arr[i] > first)
{
second = first;
first = arr[i];
}
else if (arr[i] > second)
second = arr[i];
}
printf ( "%d %d" , second, first);
}
int main()
{
int arr[] = {12, 13, 17, 10, 34, 1};
int n = sizeof (arr)/ sizeof (arr[0]);
findLargestGM(arr, n);
return 0;
}
|
Java
class GFG {
static void findLargestGM( int arr[], int n)
{
if (n < 2 )
{
System.out.print( " Invalid Input " );
}
int first = - 2147483648 , second = - 2147483648 ;
for ( int i = 0 ; i < n ; i ++)
{
if (arr[i] > first)
{
second = first;
first = arr[i];
}
else if (arr[i] > second)
second = arr[i];
}
System.out.print(second + " " + first);
}
public static void main(String arg[])
{
int arr[] = { 12 , 13 , 17 , 10 , 34 , 1 };
int n = arr.length;
findLargestGM(arr, n);
}
}
|
Python3
import sys
def findLargestGM(arr, n):
if n < 2 :
print ( " Invalid Input " )
return
first = - sys.maxsize - 1
second = - sys.maxsize - 1
for i in range ( 0 ,n):
if arr[i] > first:
second = first
first = arr[i]
else if arr[i] > second:
second = arr[i]
print ( "%d %d" % (second, first))
arr = [ 12 , 13 , 17 , 10 , 34 , 1 ]
n = len (arr)
findLargestGM(arr, n)
|
C#
using System;
class GFG {
static void findLargestGM( int []arr, int n)
{
if (n < 2)
{
Console.Write( "Invalid Input" );
}
int first = -2147483648;
int second = -2147483648;
for ( int i = 0; i < n ; i ++)
{
if (arr[i] > first)
{
second = first;
first = arr[i];
}
else if (arr[i] > second)
second = arr[i];
}
Console.Write(second + " " + first);
}
public static void Main()
{
int []arr = {12, 13, 17, 10, 34, 1};
int n = arr.Length;
findLargestGM(arr, n);
}
}
|
PHP
<?php
function findLargestGM( $arr , $n )
{
if ( $n < 2)
{
echo ( " Invalid Input " );
return ;
}
$first = PHP_INT_MIN; $second = PHP_INT_MIN;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $arr [ $i ] > $first )
{
$second = $first ;
$first = $arr [ $i ];
}
else if ( $arr [ $i ] > $second )
$second = $arr [ $i ];
}
echo ( $second . " " . $first );
}
$arr = array (12, 13, 17, 10, 34, 1);
$n = sizeof( $arr );
findLargestGM( $arr , $n );
?>
|
Javascript
<script>
function findLargestGM(arr, n)
{
if (n < 2)
{
document.write( "Invalid Input" );
}
let first = -2147483648;
let second = -2147483648;
for (let i = 0; i < n ; i ++)
{
if (arr[i] > first)
{
second = first;
first = arr[i];
}
else if (arr[i] > second)
second = arr[i];
}
document.write(second + " " + first);
}
let arr = [ 12, 13, 17, 10, 34, 1 ];
let n = arr.length;
findLargestGM(arr, n);
</script>
|
Time complexity : O(n)
Space Complexity : O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...