给定一个整数数组,找到该数组中出现次数最多的元素,并以相等的概率随机返回其索引中的任何一个。
例子:
Input:
arr[] = [-1, 4, 9, 7, 7, 2, 7, 3, 0, 9, 6, 5, 7, 8, 9]
Output:
Element with maximum frequency present at index 6
OR
Element with maximum frequency present at Index 3
OR
Element with maximum frequency present at index 4
OR
Element with maximum frequency present at index 12
All outputs above have equal probability.
想法是遍历数组一次,找出最大出现的元素及其频率n。然后,我们生成一个介于1和n之间的随机数r,最后返回数组中出现次数最多的元素的第r次出现。
以下是上述想法的实现–
C++
// C++ program to return index of most occurring element
// of the array randomly with equal probability
#include
#include
#include
using namespace std;
// Function to return index of most occurring element
// of the array randomly with equal probability
void findRandomIndexOfMax(int arr[], int n)
{
// freq store frequency of each element in the array
unordered_map freq;
for (int i = 0; i < n; i++)
freq[arr[i]] += 1;
int max_element; // stores max occurring element
// stores count of max occurring element
int max_so_far = INT_MIN;
// traverse each pair in map and find maximum
// occurring element and its frequency
for (pair p : freq)
{
if (p.second > max_so_far)
{
max_so_far = p.second;
max_element = p.first;
}
}
// generate a random number between [1, max_so_far]
int r = (rand() % max_so_far) + 1;
// traverse array again and return index of rth
// occurrence of max element
for (int i = 0, count = 0; i < n; i++)
{
if (arr[i] == max_element)
count++;
// print index of rth occurrence of max element
if (count == r)
{
cout << "Element with maximum frequency present "
"at index " << i << endl;
break;
}
}
}
// Driver code
int main()
{
// input array
int arr[] = { -1, 4, 9, 7, 7, 2, 7, 3, 0, 9, 6, 5,
7, 8, 9 };
int n = sizeof(arr) / sizeof(arr[0]);
// randomize seed
srand(time(NULL));
findRandomIndexOfMax(arr, n);
return 0;
}
Java
// Java program to return index of most occurring element
// of the array randomly with equal probability
import java.util.*;
class GFG
{
// Function to return index of most occurring element
// of the array randomly with equal probability
static void findRandomIndexOfMax(int arr[], int n)
{
// freq store frequency of each element in the array
HashMap mp = new HashMap();
for (int i = 0; i < n; i++)
if(mp.containsKey(arr[i]))
{
mp.put(arr[i], mp.get(arr[i]) + 1);
}
else
{
mp.put(arr[i], 1);
}
int max_element = Integer.MIN_VALUE; // stores max occurring element
// stores count of max occurring element
int max_so_far = Integer.MIN_VALUE;
// traverse each pair in map and find maximum
// occurring element and its frequency
for (Map.Entry p : mp.entrySet())
{
if (p.getValue() > max_so_far)
{
max_so_far = p.getValue();
max_element = p.getKey();
}
}
// generate a random number between [1, max_so_far]
int r = (int) ((new Random().nextInt(max_so_far) % max_so_far) + 1);
// traverse array again and return index of rth
// occurrence of max element
for (int i = 0, count = 0; i < n; i++)
{
if (arr[i] == max_element)
count++;
// print index of rth occurrence of max element
if (count == r)
{
System.out.print("Element with maximum frequency present "
+"at index " + i +"\n");
break;
}
}
}
// Driver code
public static void main(String[] args)
{
// input array
int arr[] = { -1, 4, 9, 7, 7, 2, 7, 3, 0, 9, 6, 5,
7, 8, 9 };
int n = arr.length;
findRandomIndexOfMax(arr, n);
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 program to return index of most occurring element
# of the array randomly with equal probability
import random
# Function to return index of most occurring element
# of the array randomly with equal probability
def findRandomIndexOfMax(arr, n):
# freq store frequency of each element in the array
mp = dict()
for i in range(n) :
if(arr[i] in mp):
mp[arr[i]] = mp[arr[i]] + 1
else:
mp[arr[i]] = 1
max_element = -323567
# stores max occurring element
# stores count of max occurring element
max_so_far = -323567
# traverse each pair in map and find maximum
# occurring element and its frequency
for p in mp :
if (mp[p] > max_so_far):
max_so_far = mp[p]
max_element = p
# generate a random number between [1, max_so_far]
r = int( ((random.randrange(1, max_so_far, 2) % max_so_far) + 1))
i = 0
count = 0
# traverse array again and return index of rth
# occurrence of max element
while ( i < n ):
if (arr[i] == max_element):
count = count + 1
# Print index of rth occurrence of max element
if (count == r):
print("Element with maximum frequency present at index " , i )
break
i = i + 1
# Driver code
# input array
arr = [-1, 4, 9, 7, 7, 2, 7, 3, 0, 9, 6, 5, 7, 8, 9]
n = len(arr)
findRandomIndexOfMax(arr, n)
# This code is contributed by Arnab Kundu
输出:
Element with maximum frequency present at index 4
上述解决方案的时间复杂度为O(n )。
该程序使用的辅助空间为O(n)。