📜  查找数组中具有最大乘积的对

📅  最后修改于: 2021-10-28 01:41:04             🧑  作者: Mango

给定一个包含 n 个元素的数组,任务是找到最大的数,使得它是给定数组的两个元素的乘积。如果不存在这样的元素,则打印 -1。元素在 1 到 10^5 的范围内。
例子 :

Input :  arr[] = {10, 3, 5, 30, 35}
Output:  30
Explanation: 30 is the product of 10 and 3.

Input :  arr[] = {2, 5, 7, 8}
Output:  -1
Explanation: Since, no such element exists.

Input :  arr[] = {10, 2, 4, 30, 35}
Output:  -1

Input :  arr[] = {10, 2, 2, 4, 30, 35}
Output:  4

Input  : arr[] = {17, 2, 1, 35, 30}
Output : 35

一种天真的方法是选择一个元素,然后检查每对乘积是否等于该数字,如果该数字最大则更新最大值,重复直到遍历整个数组需要 O(n^3) 时间。

C++
// C++ program to find a pair with product
// in given array.
#include
using namespace std;
 
// Function to find greatest number that us
int findGreatest( int arr[] , int n)
{
    int result = -1;
    for (int i = 0; i < n ; i++)
        for (int j = 0; j < n-1; j++)
            for (int k = j+1 ; k < n  ; k++)
                if (arr[j] * arr[k] == arr[i])
                    result = max(result, arr[i]);
    return result;
}
 
// Driver code
int main()
{
    // Your C++ Code
    int arr[] = {30, 10, 9, 3, 35};
    int n = sizeof(arr)/sizeof(arr[0]);
 
    cout << findGreatest(arr, n);
 
    return 0;
}


Java
// Java program to find a pair
// with product in given array.
import java.io.*;
 
class GFG{
 
static int findGreatest( int []arr , int n)
{
    int result = -1;
    for (int i = 0; i < n ; i++)
        for (int j = 0; j < n-1; j++)
            for (int k = j+1 ; k < n ; k++)
                if (arr[j] * arr[k] == arr[i])
                    result = Math.max(result, arr[i]);
    return result;
}
 
    // Driver code
    static public void main (String[] args)
    {
        int []arr = {30, 10, 9, 3, 35};
        int n = arr.length;
 
        System.out.println(findGreatest(arr, n));
    }
}
 
//This code is contributed by vt_m.


Python 3
# Python 3 program to find a pair
# with product in given array.
 
# Function to find greatest number
def findGreatest( arr , n):
 
    result = -1
    for i in range(n):
        for j in range(n - 1):
            for k in range(j + 1, n):
                if (arr[j] * arr[k] == arr[i]):
                    result = max(result, arr[i])
    return result
 
# Driver code
if __name__ == "__main__":
     
    arr = [ 30, 10, 9, 3, 35]
    n = len(arr)
 
    print(findGreatest(arr, n))
 
# This code is contributed by ita_c


C#
// C# program to find a pair with product
// in given array.
using System;
 
class GFG{
 
static int findGreatest( int []arr , int n)
{
    int result = -1;
    for (int i = 0; i < n ; i++)
        for (int j = 0; j < n-1; j++)
            for (int k = j+1 ; k < n ; k++)
                if (arr[j] * arr[k] == arr[i])
                    result = Math.Max(result, arr[i]);
    return result;
}
 
    // Driver code
    static public void Main ()
    {
       int []arr = {30, 10, 9, 3, 35};
       int n = arr.Length;
 
       Console.WriteLine(findGreatest(arr, n));
    }
}
 
//This code is contributed by vt_m.


PHP


Javascript


C++
// C++ program to find the largest product number
#include
using namespace std;
 
// Function to find greatest number
int findGreatest(int arr[], int n)
{
    // Store occurrences of all elements in hash
    // array
    unordered_map m;
    for (int i = 0 ; i < n; i++)
        m[arr[i]]++;
 
    // Sort the array and traverse all elements from
    // end.
    sort(arr, arr+n);
 
    for (int i=n-1; i>1; i--)
    {
        // For every element, check if there is another
        // element which divides it.
        for (int j=0; j 0)
                    return arr[i];
 
                // To handle the case like arr[i] = 4 and
                // arr[j] = 2
                else if (result == arr[j] && m[result] > 1)
                    return arr[i];
            }
        }
    }
    return -1;
}
 
// Drivers code
int main()
{
    int arr[] = {17, 2, 1, 15, 30};
    int n = sizeof(arr)/sizeof(arr[0]);
    cout << findGreatest(arr, n);
    return 0;
}


Java
// Java program to find the largest product number
import java.util.*;
 
class GFG
{
 
    // Function to find greatest number
    static int findGreatest(int arr[], int n)
    {
        // Store occurrences of all
        // elements in hash array
        Map m = new HashMap<>();
        for (int i = 0; i < n; i++)
        {
            if (m.containsKey(arr[i]))
            {
                m.put(arr[i], m.get(arr[i]) + 1);
            }
            else
            {
                m.put(arr[i], m.get(arr[i]));
            }
        }
 
        // m[arr[i]]++;
        // Sort the array and traverse
        // all elements from end.
        Arrays.sort(arr);
 
        for (int i = n - 1; i > 1; i--)
        {
            // For every element, check if there is another
            // element which divides it.
            for (int j = 0; j < i &&
                arr[j] <= Math.sqrt(arr[i]); j++)
            {
                if (arr[i] % arr[j] == 0)
                {
                    int result = arr[i] / arr[j];
 
                    // Check if the result value exists in array
                    // or not if yes the return arr[i]
                    if (result != arr[j] &&
                        m.get(result) == null|| m.get(result) > 0)
                    {
                        return arr[i];
                    }
                     
                    // To handle the case like arr[i] = 4
                    // and arr[j] = 2
                    else if (result == arr[j] && m.get(result) > 1)
                    {
                        return arr[i];
                    }
                }
            }
        }
        return -1;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = {17, 2, 1, 15, 30};
        int n = arr.length;
        System.out.println(findGreatest(arr, n));
    }
}
 
// This code is contributed by PrinciRaj1992


Python
# Python3 program to find the largest product number
from math import sqrt
 
# Function to find greatest number
def findGreatest(arr, n):
 
    # Store occurrences of all elements in hash
    # array
    m = dict()
 
    for i in arr:
        m[i] = m.get(i, 0) + 1
 
    # Sort the array and traverse all elements from
    # end.
    arr=sorted(arr)
 
    for i in range(n - 1, 0, -1):
         
        # For every element, check if there is another
        # element which divides it.
        j = 0
        while(j < i and arr[j] <= sqrt(arr[i])):
 
            if (arr[i] % arr[j] == 0):
 
                result = arr[i]//arr[j]
 
                # Check if the result value exists in array
                # or not if yes the return arr[i]
                if (result != arr[j] and (result in m.keys() )and m[result] > 0):
                    return arr[i]
 
                # To handle the case like arr[i] = 4 and
                # arr[j] = 2
                elif (result == arr[j] and (result in m.keys()) and m[result] > 1):
                    return arr[i]
 
            j += 1
 
 
    return -1
 
# Drivers code
arr= [17, 2, 1, 15, 30]
n = len(arr)
print(findGreatest(arr, n))
 
# This code is contributed by mohit kumar


C#
// C# program to find the largest product number
using System;
using System.Collections.Generic;
 
class GFG
{
 
    // Function to find greatest number
    static int findGreatest(int []arr, int n)
    {
        // Store occurrences of all
        // elements in hash array
        Dictionary m = new Dictionary ();
        for (int i = 0; i < n; i++)
        {
            if (m.ContainsKey(arr[i]))
            {
                var a = m[arr[i]] + 1;
                 
                // m.Remove(arr[i]);
                m.Add(arr[i], a);
            }
            else
            {
                m.Add(arr[i], arr[i]);
            }
        }
 
        // m[arr[i]]++;
        // Sort the array and traverse
        // all elements from end.
        Array.Sort(arr);
 
        for (int i = n - 1; i > 1; i--)
        {
            // For every element, check if there is another
            // element which divides it.
            for (int j = 0; j < i &&
                arr[j] <= Math.Sqrt(arr[i]); j++)
            {
                if (arr[i] % arr[j] == 0)
                {
                    int result = arr[i] / arr[j];
 
                    // Check if the result value exists in array
                    // or not if yes the return arr[i]
                    if (result != arr[j] &&
                        m[result] == null|| m[result] > 0)
                    {
                        return arr[i];
                    }
                     
                    // To handle the case like arr[i] = 4
                    // and arr[j] = 2
                    else if (result == arr[j] && m[result] > 1)
                    {
                        return arr[i];
                    }
                }
            }
        }
        return -1;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int []arr = {17, 2, 1, 15, 30};
        int n = arr.Length;
        Console.WriteLine(findGreatest(arr, n));
    }
}
 
// This code contributed by Rajput-Ji


Javascript


输出 :

30

一种有效的方法如下实现:-

  1. 创建一个空的哈希表并将所有数组元素存储在其中。
  2. 按升序对数组进行排序。
  3. 从数组的末尾一个一个地选取元素。
  4. 并检查是否存在乘积等于该数字的对。在这个效率上是可以达到的。这个想法是达到那个数字的sqrt。如果我们在 sqrt 之前没有得到这对,这意味着不存在这样的对。我们使用哈希表来确保我们可以在 O(1) 时间内找到 pair 的其他元素。
  5. 重复步骤 2 到 3,直到我们得到元素或整个数组被遍历。

下面是实现。

C++

// C++ program to find the largest product number
#include
using namespace std;
 
// Function to find greatest number
int findGreatest(int arr[], int n)
{
    // Store occurrences of all elements in hash
    // array
    unordered_map m;
    for (int i = 0 ; i < n; i++)
        m[arr[i]]++;
 
    // Sort the array and traverse all elements from
    // end.
    sort(arr, arr+n);
 
    for (int i=n-1; i>1; i--)
    {
        // For every element, check if there is another
        // element which divides it.
        for (int j=0; j 0)
                    return arr[i];
 
                // To handle the case like arr[i] = 4 and
                // arr[j] = 2
                else if (result == arr[j] && m[result] > 1)
                    return arr[i];
            }
        }
    }
    return -1;
}
 
// Drivers code
int main()
{
    int arr[] = {17, 2, 1, 15, 30};
    int n = sizeof(arr)/sizeof(arr[0]);
    cout << findGreatest(arr, n);
    return 0;
}

Java

// Java program to find the largest product number
import java.util.*;
 
class GFG
{
 
    // Function to find greatest number
    static int findGreatest(int arr[], int n)
    {
        // Store occurrences of all
        // elements in hash array
        Map m = new HashMap<>();
        for (int i = 0; i < n; i++)
        {
            if (m.containsKey(arr[i]))
            {
                m.put(arr[i], m.get(arr[i]) + 1);
            }
            else
            {
                m.put(arr[i], m.get(arr[i]));
            }
        }
 
        // m[arr[i]]++;
        // Sort the array and traverse
        // all elements from end.
        Arrays.sort(arr);
 
        for (int i = n - 1; i > 1; i--)
        {
            // For every element, check if there is another
            // element which divides it.
            for (int j = 0; j < i &&
                arr[j] <= Math.sqrt(arr[i]); j++)
            {
                if (arr[i] % arr[j] == 0)
                {
                    int result = arr[i] / arr[j];
 
                    // Check if the result value exists in array
                    // or not if yes the return arr[i]
                    if (result != arr[j] &&
                        m.get(result) == null|| m.get(result) > 0)
                    {
                        return arr[i];
                    }
                     
                    // To handle the case like arr[i] = 4
                    // and arr[j] = 2
                    else if (result == arr[j] && m.get(result) > 1)
                    {
                        return arr[i];
                    }
                }
            }
        }
        return -1;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = {17, 2, 1, 15, 30};
        int n = arr.length;
        System.out.println(findGreatest(arr, n));
    }
}
 
// This code is contributed by PrinciRaj1992

Python

# Python3 program to find the largest product number
from math import sqrt
 
# Function to find greatest number
def findGreatest(arr, n):
 
    # Store occurrences of all elements in hash
    # array
    m = dict()
 
    for i in arr:
        m[i] = m.get(i, 0) + 1
 
    # Sort the array and traverse all elements from
    # end.
    arr=sorted(arr)
 
    for i in range(n - 1, 0, -1):
         
        # For every element, check if there is another
        # element which divides it.
        j = 0
        while(j < i and arr[j] <= sqrt(arr[i])):
 
            if (arr[i] % arr[j] == 0):
 
                result = arr[i]//arr[j]
 
                # Check if the result value exists in array
                # or not if yes the return arr[i]
                if (result != arr[j] and (result in m.keys() )and m[result] > 0):
                    return arr[i]
 
                # To handle the case like arr[i] = 4 and
                # arr[j] = 2
                elif (result == arr[j] and (result in m.keys()) and m[result] > 1):
                    return arr[i]
 
            j += 1
 
 
    return -1
 
# Drivers code
arr= [17, 2, 1, 15, 30]
n = len(arr)
print(findGreatest(arr, n))
 
# This code is contributed by mohit kumar

C#

// C# program to find the largest product number
using System;
using System.Collections.Generic;
 
class GFG
{
 
    // Function to find greatest number
    static int findGreatest(int []arr, int n)
    {
        // Store occurrences of all
        // elements in hash array
        Dictionary m = new Dictionary ();
        for (int i = 0; i < n; i++)
        {
            if (m.ContainsKey(arr[i]))
            {
                var a = m[arr[i]] + 1;
                 
                // m.Remove(arr[i]);
                m.Add(arr[i], a);
            }
            else
            {
                m.Add(arr[i], arr[i]);
            }
        }
 
        // m[arr[i]]++;
        // Sort the array and traverse
        // all elements from end.
        Array.Sort(arr);
 
        for (int i = n - 1; i > 1; i--)
        {
            // For every element, check if there is another
            // element which divides it.
            for (int j = 0; j < i &&
                arr[j] <= Math.Sqrt(arr[i]); j++)
            {
                if (arr[i] % arr[j] == 0)
                {
                    int result = arr[i] / arr[j];
 
                    // Check if the result value exists in array
                    // or not if yes the return arr[i]
                    if (result != arr[j] &&
                        m[result] == null|| m[result] > 0)
                    {
                        return arr[i];
                    }
                     
                    // To handle the case like arr[i] = 4
                    // and arr[j] = 2
                    else if (result == arr[j] && m[result] > 1)
                    {
                        return arr[i];
                    }
                }
            }
        }
        return -1;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int []arr = {17, 2, 1, 15, 30};
        int n = arr.Length;
        Console.WriteLine(findGreatest(arr, n));
    }
}
 
// This code contributed by Rajput-Ji

Javascript


输出 :

30

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程