给定一个包含 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
一种有效的方法如下实现:-
- 创建一个空的哈希表并将所有数组元素存储在其中。
- 按升序对数组进行排序。
- 从数组的末尾一个一个地选取元素。
- 并检查是否存在乘积等于该数字的对。在这个效率上是可以达到的。这个想法是达到那个数字的sqrt。如果我们在 sqrt 之前没有得到这对,这意味着不存在这样的对。我们使用哈希表来确保我们可以在 O(1) 时间内找到 pair 的其他元素。
- 重复步骤 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 现场工作专业课程和学生竞争性编程现场课程。