找到具有最大几何平均值的子集
给定一个正整数数组,任务是我们找到一个大小大于 1 且积最大的子集。
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
一种简单的方法是运行两个循环并逐一检查给出最大几何平均值 (GM) 的数组元素。此解决方案的时间复杂度为 O(n*n),并且此解决方案也会导致溢出。
一个有效的解决方案是基于这样一个事实,即最大的两个元素总是会产生最大的平均值,因为问题需要找到一个大小大于一个的子集。
C++
// C++ program to find a subset of size 2 or
// greater with greatest geometric mean. This
// program basically find largest two elements.
#include
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
$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
输出:
17 34
时间复杂度:O(n)
空间复杂度:O(1)