给定一个整数数组,我们需要打印k个最频繁的元素。如果存在平局,我们需要优先考虑首次出现的元素。
例子:
Input : arr[] = {10, 5, 20, 5, 10, 10, 30}, k = 2
Output : 10 5
Input : arr[] = {7, 7, 6, 6, 6, 7, 5, 4, 4, 10, 5}, k = 3
Output : 7 6 5
Explanation :
In this example, 7 and 6 have same frequencies. We print 7 first because first appearance of 7 is first. Similarly, 5 and 4 have same frequencies. We prefer 5 because 5’s first appearance is first.
我们在下面的帖子中讨论了两种方法
查找给定数组中出现次数最多的k个数字
让我们首先讨论一个简单的解决方案,该解决方案在出现领带时以任何顺序打印。然后,我们将讨论订购的解决方案。
这个想法是将哈希与频率索引一起使用。我们首先将计数存储在哈希中。然后,我们遍历哈希并使用频率作为索引来存储具有给定频率的元素。此处的重要因素是,最大频率可以为n。因此,大小为n + 1的数组会很好。
C++
// C++ implementation to find k numbers with most
// occurrences in the given array
#include
using namespace std;
// funnction to print the k numbers with most occurrences
void print_N_mostFrequentNumber(int arr[], int n, int k)
{
// unordered_map 'um' implemented as frequency
// hash table
unordered_map um;
for (int i = 0; i < n; i++)
um[arr[i]]++;
// Use frequencies as indexes and put
// elements with given frequency in a
// vector (related to a frequency)
vector freq[n + 1];
for (auto x : um)
freq[x.second].push_back(x.first);
// Initialize count of items printed
int count = 0;
// Traverse the frequency array from
// right side as we need the most
// frequent items.
for (int i = n; i >= 0; i--) {
// Print items of current frequency
for (int x : freq[i]) {
cout << x << " ";
count++;
if (count == k)
return;
}
}
}
// Driver program to test above
int main()
{
int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
int k = 2;
print_N_mostFrequentNumber(arr, n, k);
return 0;
}
Java
// Java implementation to find k elements with max occurence.
import java.util.*;
public class KFrequentNumbers {
static void print_N_mostFrequentNumber(int[] arr, int n, int k)
{
Map mp = new HashMap();
// Put count of all the distinct elements in Map
// with element as the key & count as the value.
for (int i = 0; i < n; i++) {
// Get the count for the element if already
// present in the Map or get the default value
// which is 0.
mp.put(arr[i], mp.getOrDefault(arr[i], 0) + 1);
}
// Initialize an array list of array lists
List > freq = new ArrayList >();
for (int i = 0; i <= n; i++)
freq.add(new ArrayList());
// Use frequencies as indexes and add corresponding
// values to the list
for (Map.Entry x : mp.entrySet())
freq.get(x.getValue()).add(x.getKey());
// Traverse freq[] from right side.
int count = 0;
for (int i = n; i >= 0; i--) {
for (int x : freq.get(i)) {
System.out.println(x);
count++;
if (count == k)
return;
}
}
}
// Driver Code to test the code.
public static void main(String[] args)
{
int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
int n = arr.length;
int k = 2;
print_N_mostFrequentNumber(arr, n, k);
}
}
Python3
# Python3 implementation to find k numbers
# with most occurrences in the given array
# Function to prthe k numbers with most occurrences
def print_N_mostFrequentNumber(arr, n, k):
# unordered_map 'um' implemented as
# frequency hash table
um = {}
for i in range(n):
um[arr[i]] = um.get(arr[i], 0) + 1
# Use frequencies as indexes and put
# elements with given frequency in a
# vector (related to a frequency)
freq = [[] for i in range(n + 1)]
for x in um:
freq[um[x]].append(x)
# Initialize count of items printed
count = 0
# Traverse the frequency array from
# right side as we need the most
# frequent items.
for i in range(n, -1, -1):
# Print items of current frequency
for x in sorted(freq[i])[::-1]:
print(x, end = " ")
count += 1
if (count == k):
return
# Driver code
if __name__ == '__main__':
arr = [ 3, 1, 4, 4, 5, 2, 6, 1 ]
n = len(arr)
k = 2
print_N_mostFrequentNumber(arr, n, k)
# This code is contributed by mohit kumar 29
C#
// C# implementation to find
// k elements with max occurence.
using System;
using System.Collections.Generic;
class KFrequentNumbers{
static void print_N_mostFrequentNumber(int[] arr,
int n, int k)
{
Dictionary mp = new Dictionary();
// Put count of all the
// distinct elements in Map
// with element as the key
// & count as the value.
for (int i = 0; i < n; i++)
{
// Get the count for the
// element if already
// present in the Map
// or get the default value
// which is 0.
if(mp.ContainsKey(arr[i]))
{
mp[arr[i]] = mp[arr[i]] + 1;
}
else
{
mp.Add(arr[i], 1);
}
}
// Initialize an array
// list of array lists
List > freq =
new List >();
for (int i = 0; i <= n; i++)
freq.Add(new List());
// Use frequencies as indexes
// and add corresponding
// values to the list
foreach (KeyValuePair x in mp)
freq[x.Value].Add(x.Key);
// Traverse []freq from
// right side.
int count = 0;
for (int i = n; i >= 0; i--)
{
foreach (int x in freq[i])
{
Console.WriteLine(x);
count++;
if (count == k)
return;
}
}
}
// Driver Code to test the code.
public static void Main(String[] args)
{
int []arr = {3, 1, 4, 4,
5, 2, 6, 1};
int n = arr.Length;
int k = 2;
print_N_mostFrequentNumber(arr, n, k);
}
}
// This code is contributed by Princi Singh
C++
// C++ implementation to find k numbers with most
// occurrences in the given array
#include
using namespace std;
// function to print the k numbers with most occurrences
void print_N_mostFrequentNumber(int arr[], int n, int k)
{
// unordered_map 'um' implemented as frequency
// hash table
unordered_map um;
for (int i = 0; i < n; i++)
um[arr[i]]++;
// Use frequencies as indexes and put
// elements with given frequency in a
// vector (related to a frequency)
vector freq[n + 1];
for (int i = 0; i < n; i++) {
int f = um[arr[i]];
if (f != -1) {
freq[f].push_back(arr[i]);
um[arr[i]] = -1;
}
}
// Initialize count of items printed
int count = 0;
// Traverse the frequency array from
// right side as we need the most
// frequent items.
for (int i = n; i >= 0; i--) {
// Print items of current frequency
for (int x : freq[i]) {
cout << x << " ";
count++;
if (count == k)
return;
}
}
}
// Driver program to test above
int main()
{
int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
print_N_mostFrequentNumber(arr, n, k);
return 0;
}
Java
// Java implementation to find k elements with max occurence.
import java.util.*;
public class KFrequentNumbers {
static void print_N_mostFrequentNumber(int[] arr, int n, int k)
{
Map mp = new HashMap();
// Put count of all the distinct elements in Map
// with element as the key & count as the value.
for (int i = 0; i < n; i++) {
// Get the count for the element if already
// present in the Map or get the default value
// which is 0.
mp.put(arr[i], mp.getOrDefault(arr[i], 0) + 1);
}
// Initialize an array list of array lists
List > freq = new ArrayList >();
for (int i = 0; i <= n; i++)
freq.add(new ArrayList());
// Use frequencies as indexes and add corresponding
// values to the list
for (int i = 0; i < n; i++) {
int f = mp.get(arr[i]);
if (f != -1) {
freq.get(f).add(arr[i]);
mp.put(arr[i], -1);
}
}
// Traverse freq[] from right side.
int count = 0;
for (int i = n; i >= 0; i--) {
for (int x : freq.get(i)) {
System.out.println(x);
count++;
if (count == k)
return;
}
}
}
// Driver Code to test the code.
public static void main(String[] args)
{
int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
int n = arr.length;
int k = 3;
print_N_mostFrequentNumber(arr, n, k);
}
}
C#
// C# implementation to find k elements
// with max occurence.
using System;
using System.Collections.Generic;
class GFG{
static void print_N_mostFrequentNumber(int[] arr,
int n, int k)
{
Dictionary mp = new Dictionary();
// Put count of all the distinct
// elements in Map with element
// as the key & count as the value.
for(int i = 0; i < n; i++)
{
// Get the count for the element
// if already present in the Map
// or get the default value which is 0.
if (mp.ContainsKey(arr[i]))
mp[arr[i]]++;
else
mp.Add(arr[i], 0);
}
// Initialize an array list of array lists
List> freq = new List>();
for(int i = 0; i <= n; i++)
freq.Add(new List());
// Use frequencies as indexes and
// add corresponding values to
// the list
for(int i = 0; i < n; i++)
{
int f = mp[arr[i]];
if (f != -1)
{
freq[f].Add(arr[i]);
if (mp.ContainsKey(arr[i]))
mp[arr[i]] = -1;
else
mp.Add(arr[i], 0);
}
}
// Traverse []freq from right side.
int count = 0;
for(int i = n; i >= 0; i--)
{
foreach(int x in freq[i])
{
Console.Write(x);
Console.Write(" ");
count++;
if (count == k)
return;
}
}
}
// Driver Code
public static void Main(String[] args)
{
int []arr = { 3, 1, 4, 4, 5, 2, 6, 1 };
int n = arr.Length;
int k = 3;
print_N_mostFrequentNumber(arr, n, k);
}
}
// This code is contributed by Amit Katiyar
4 1
时间复杂度: O(n)
辅助空间: O(n)根据第一个外观进行打印。为了保持所需的顺序,我们遍历原始数组而不是地图。为避免重复,我们需要在映射中将已处理条目标记为-1。
C++
// C++ implementation to find k numbers with most
// occurrences in the given array
#include
using namespace std;
// function to print the k numbers with most occurrences
void print_N_mostFrequentNumber(int arr[], int n, int k)
{
// unordered_map 'um' implemented as frequency
// hash table
unordered_map um;
for (int i = 0; i < n; i++)
um[arr[i]]++;
// Use frequencies as indexes and put
// elements with given frequency in a
// vector (related to a frequency)
vector freq[n + 1];
for (int i = 0; i < n; i++) {
int f = um[arr[i]];
if (f != -1) {
freq[f].push_back(arr[i]);
um[arr[i]] = -1;
}
}
// Initialize count of items printed
int count = 0;
// Traverse the frequency array from
// right side as we need the most
// frequent items.
for (int i = n; i >= 0; i--) {
// Print items of current frequency
for (int x : freq[i]) {
cout << x << " ";
count++;
if (count == k)
return;
}
}
}
// Driver program to test above
int main()
{
int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
print_N_mostFrequentNumber(arr, n, k);
return 0;
}
Java
// Java implementation to find k elements with max occurence.
import java.util.*;
public class KFrequentNumbers {
static void print_N_mostFrequentNumber(int[] arr, int n, int k)
{
Map mp = new HashMap();
// Put count of all the distinct elements in Map
// with element as the key & count as the value.
for (int i = 0; i < n; i++) {
// Get the count for the element if already
// present in the Map or get the default value
// which is 0.
mp.put(arr[i], mp.getOrDefault(arr[i], 0) + 1);
}
// Initialize an array list of array lists
List > freq = new ArrayList >();
for (int i = 0; i <= n; i++)
freq.add(new ArrayList());
// Use frequencies as indexes and add corresponding
// values to the list
for (int i = 0; i < n; i++) {
int f = mp.get(arr[i]);
if (f != -1) {
freq.get(f).add(arr[i]);
mp.put(arr[i], -1);
}
}
// Traverse freq[] from right side.
int count = 0;
for (int i = n; i >= 0; i--) {
for (int x : freq.get(i)) {
System.out.println(x);
count++;
if (count == k)
return;
}
}
}
// Driver Code to test the code.
public static void main(String[] args)
{
int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
int n = arr.length;
int k = 3;
print_N_mostFrequentNumber(arr, n, k);
}
}
C#
// C# implementation to find k elements
// with max occurence.
using System;
using System.Collections.Generic;
class GFG{
static void print_N_mostFrequentNumber(int[] arr,
int n, int k)
{
Dictionary mp = new Dictionary();
// Put count of all the distinct
// elements in Map with element
// as the key & count as the value.
for(int i = 0; i < n; i++)
{
// Get the count for the element
// if already present in the Map
// or get the default value which is 0.
if (mp.ContainsKey(arr[i]))
mp[arr[i]]++;
else
mp.Add(arr[i], 0);
}
// Initialize an array list of array lists
List> freq = new List>();
for(int i = 0; i <= n; i++)
freq.Add(new List());
// Use frequencies as indexes and
// add corresponding values to
// the list
for(int i = 0; i < n; i++)
{
int f = mp[arr[i]];
if (f != -1)
{
freq[f].Add(arr[i]);
if (mp.ContainsKey(arr[i]))
mp[arr[i]] = -1;
else
mp.Add(arr[i], 0);
}
}
// Traverse []freq from right side.
int count = 0;
for(int i = n; i >= 0; i--)
{
foreach(int x in freq[i])
{
Console.Write(x);
Console.Write(" ");
count++;
if (count == k)
return;
}
}
}
// Driver Code
public static void Main(String[] args)
{
int []arr = { 3, 1, 4, 4, 5, 2, 6, 1 };
int n = arr.Length;
int k = 3;
print_N_mostFrequentNumber(arr, n, k);
}
}
// This code is contributed by Amit Katiyar
1 4 3
时间复杂度: O(n)
辅助空间: O(n)