📜  找到具有最大几何平均值的子集

📅  最后修改于: 2022-05-13 01:57:52.501000             🧑  作者: Mango

找到具有最大几何平均值的子集

给定一个正整数数组,任务是我们找到一个大小大于 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)