Open In App

Find K most occurring elements in the given Array

Last Updated : 15 May, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array of N numbers and a positive integer K. The problem is to find K numbers with the most occurrences, i.e., the top K numbers having the maximum frequency. If two numbers have the same frequency then the number with a larger value should be given preference. The numbers should be displayed in decreasing order of their frequencies. It is assumed that the array consists of at least K numbers.

Examples: 

Input: arr[] = {3, 1, 4, 4, 5, 2, 6, 1}, K = 2
Output: 4 1
Explanation:
Frequency of 4 = 2, Frequency of 1 = 2
These two have the maximum frequency and 4 is larger than 1.

Input: arr[] = {7, 10, 11, 5, 2, 5, 5, 7, 11, 8, 9}, K = 4
Output: 5 11 7 10
Explanation: 
Frequency of 5 = 3, Frequency of 11 = 2, Frequency of 7 = 2, Frequency of 10 = 1
These four have the maximum frequency and 5 is largest among rest.

Find K most occurring elements in the given Array using Map

To solve the problem using this approach follow the below idea:

create a Map to store the element-frequency pair. Map is used to perform insertion and updation in constant time. Then sort the element-frequency pair in decreasing order of frequency. This gives the information about each element and the number of times they are present in the array. To get K elements of the array, print the first K elements of the sorted array.

Follow the given steps to solve the problem:

  • Create a map mp, to store key-value pair, i.e. element-frequency pair.
  • Traverse the array from start to end.
  • For every element in the array update mp[array[i]]++
  • Store the element-frequency pair in a vector and sort the vector in decreasing order of frequency.
  • Print the first k elements of the sorted array.

Below is the Implementation of the above approach:

C++
// C++ implementation to find k numbers with most
// occurrences in the given array
#include <bits/stdc++.h>
using namespace std;

// Comparison function to sort the 'freq_arr[]'
bool compare(pair<int, int> p1, pair<int, int> p2)
{
    // If frequencies of two elements are same
    // then the larger number should come first
    if (p1.second == p2.second)
        return p1.first > p2.first;

    // Sort on the basis of decreasing order
    // of frequencies
    return p1.second > p2.second;
}

// Function to print the k numbers with most occurrences
void print_N_mostFrequentNumber(int arr[], int N, int K)
{
    // unordered_map 'mp' implemented as frequency hash
    // table
    unordered_map<int, int> mp;
    for (int i = 0; i < N; i++)
        mp[arr[i]]++;

    // store the elements of 'mp' in the vector 'freq_arr'
    vector<pair<int, int> > freq_arr(mp.begin(), mp.end());

    // Sort the vector 'freq_arr' on the basis of the
    // 'compare' function
    sort(freq_arr.begin(), freq_arr.end(), compare);

    // display the top k numbers
    cout << K << " numbers with most occurrences are:\n";
    for (int i = 0; i < K; i++)
        cout << freq_arr[i].first << " ";
}

// Driver's code
int main()
{
    int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 2;

    // Function call
    print_N_mostFrequentNumber(arr, N, K);

    return 0;
}
Java
// Java implementation to find
// K elements with max occurrence.

import java.util.*;
public class KFrequentNumbers {
    static void print_N_mostFrequentNumber(int[] arr, int N,
                                           int K)
    {

        Map<Integer, Integer> mp
            = new HashMap<Integer, Integer>();

        // 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);
        }

        // Create a list from elements of HashMap
        List<Map.Entry<Integer, Integer> > list
            = new ArrayList<Map.Entry<Integer, Integer> >(
                mp.entrySet());

        // Sort the list
        Collections.sort(
            list,
            new Comparator<Map.Entry<Integer, Integer> >() {
                public int compare(
                    Map.Entry<Integer, Integer> o1,
                    Map.Entry<Integer, Integer> o2)
                {
                    if (o1.getValue() == o2.getValue())
                        return o2.getKey() - o1.getKey();
                    else
                        return o2.getValue()
                            - o1.getValue();
                }
            });

        for (int i = 0; i < K; i++)
            System.out.print(list.get(i).getKey() + " ");
    }

    // Driver's Code
    public static void main(String[] args)
    {
        int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
        int N = arr.length;
        int K = 2;

        // Function call
        System.out.println(
            K + " numbers with most occurrences are:");
        print_N_mostFrequentNumber(arr, N, K);
    }
}
Python
# Python3 implementation to find k numbers
# with most occurrences in the given array

# Function to print the k numbers with
# most occurrences


def pr_N_mostFrequentNumber(arr, N, K):

    mp = {}
    for i in range(N):
        if arr[i] in mp:
            mp[arr[i]] += 1
        else:
            mp[arr[i]] = 1
    a = [0] * (len(mp))
    j = 0
    for i in mp:
        a[j] = [i, mp[i]]
        j += 1
    a = sorted(a, key=lambda x: x[0],
               reverse=True)
    a = sorted(a, key=lambda x: x[1],
               reverse=True)

    # Display the top k numbers
    print(K, "numbers with most occurrences are:")
    for i in range(K):
        print(a[i][0], end=" ")


# Driver code
if __name__ == "__main__":
    arr = [3, 1, 4, 4, 5, 2, 6, 1]
    N = 8
    K = 2

    # Function call
    pr_N_mostFrequentNumber(arr, N, K)

# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)
C#
// C# implementation to find
// k elements with max occurrence.

using System;
using System.Collections.Generic;

public class Comparer : IComparer<KeyValuePair<int, int> > {
    public int Compare(KeyValuePair<int, int> p2,
                       KeyValuePair<int, int> p1)
    {
        // If frequencies of two elements are same
        // then the larger number should come first
        if (p1.Value == p2.Value)
            return p1.Key.CompareTo(p2.Key);

        // Sort on the basis of decreasing order
        // of frequencies
        return p1.Value.CompareTo(p2.Value);
    }
}

public class KFrequentNumbers {
    static void print_N_mostFrequentNumber(int[] arr, int N,
                                           int K)
    {

        IDictionary<int, int> mp
            = new Dictionary<int, int>();

        // 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]] += 1;
            else
                mp[arr[i]] = 1;
        }

        // Create a list from elements of HashMap
        List<KeyValuePair<int, int> > list
            = new List<KeyValuePair<int, int> >();
        foreach(KeyValuePair<int, int> entry in mp)
        {
            list.Add(entry);
        }

        // Sort the list
        Comparer compare = new Comparer();
        list.Sort(compare);

        for (int i = 0; i < K; i++)
            Console.Write(list[i].Key + " ");
    }

    // Driver's code
    public static void Main(string[] args)
    {
        int[] arr = { 3, 1, 4, 4, 5, 2, 6, 1 };
        int N = arr.Length;
        int K = 2;

        Console.Write(
            K + " elements with most occurrences are:\n");

        // Function call
        print_N_mostFrequentNumber(arr, N, K);
    }
}

// this code is contributed by phasing17
Javascript
// JavaScript implementation to find
// K elements with max occurrence.

function print_N_mostFrequentNumber(arr, N, K) {

    let mp = new Map();

    // Put count of all the
    // distinct elements in Map
    // with element as the key &
    // count as the value.
    for (let 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.has(arr[i])) {
            mp.set(arr[i], mp.get(arr[i]) + 1)
        } else {
            mp.set(arr[i], 1)
        }
    }

    // Create a list from elements of HashMap
    let list = [...mp];

    // Sort the list
    list.sort((o1, o2) => {
        if (o1[1] == o2[1])
            return o2[0] - o1[0];
        else
            return o2[1] - o1[1];
    })

    console.log(K + " numbers with most occurrences are: ");
    for (let i = 0; i < K; i++)
       console.log(list[i][0] + " ");
}

// Driver's Code
let arr = [3, 1, 4, 4, 5, 2, 6, 1];
let N = arr.length;
let K = 2;

// Function call
print_N_mostFrequentNumber(arr, N, K);

Output
2 numbers with most occurrences are:
4 1 

Time Complexity: O(D log D), where D is the count of distinct elements in the array
Auxiliary Space: O(D), where D is the count of distinct elements in the array

Find K most occurring elements in the given Array using Max-Heap 

To solve the problem using this approach follow the below idea:

Approach: Create a Map to store element-frequency pair. Map is used to perform insertion and updation in constant time. Then use a priority queue to store the element-frequency pair (Max-Heap). The element which has maximum frequency, comes at the root of the Priority Queue. Remove the top or root of Priority Queue K times and print the element.

Follow the given steps to solve the problem:

  • Create a map mp, to store key-value pair, i.e. element-frequency pair.
  • Traverse the array from start to end.
  • For every element in the array update mp[array[i]]++
  • Store the element-frequency pair in a Priority Queue
  • Run a loop k times, and in each iteration remove the root of the priority queue and print the element.

Below is the Implementation of the above approach:

C++
// C++ implementation to find k numbers with most
// occurrences in the given array

#include <bits/stdc++.h>
using namespace std;

// Comparison function defined for the priority queue
struct compare {
    bool operator()(pair<int, int> p1, pair<int, int> p2)
    {
        // If frequencies of two elements are same
        // then the larger number should come first
        if (p1.second == p2.second)
            return p1.first < p2.first;

        // Insert elements in the priority queue on the
        // basis of decreasing order of frequencies
        return p1.second < p2.second;
    }
};

// Function to print the k numbers with most occurrences
void print_N_mostFrequentNumber(int arr[], int N, int K)
{
    // unordered_map 'mp' implemented as frequency hash
    // table
    unordered_map<int, int> mp;
    for (int i = 0; i < N; i++)
        mp[arr[i]]++;

    // priority queue 'pq' implemented as max heap on the
    // basis of the comparison operator 'compare' element
    // with the highest frequency is the root of 'pq' in
    // case of conflicts, larger element is the root
    priority_queue<pair<int, int>, vector<pair<int, int> >,
                   compare>
        pq(mp.begin(), mp.end());

    // Display the top k numbers
    cout << K << " numbers with most occurrences are:\n";
    for (int i = 1; i <= K; i++) {
        cout << pq.top().first << " ";
        pq.pop();
    }
}

// Driver's code
int main()
{
    int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 2;

    // Function call
    print_N_mostFrequentNumber(arr, N, K);
    return 0;
}
Java
// Java implementation to find k
// elements with max occurrence.
import java.util.*;
public class KFrequentNumbers {
    static void print_N_mostFrequentNumber(int[] arr, int N,
                                           int K)
    {
        Map<Integer, Integer> mp
            = new HashMap<Integer, Integer>();

        // 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);
        }

        // Create a Priority Queue
        // to sort based on the
        // count or on the key if the
        // count is same
        PriorityQueue<Map.Entry<Integer, Integer> > queue
            = new PriorityQueue<>(
                (a, b)
                    -> a.getValue().equals(b.getValue())
                           ? Integer.compare(b.getKey(),
                                             a.getKey())
                           : Integer.compare(b.getValue(),
                                             a.getValue()));

        // Insert the data from the map
        // to the Priority Queue.
        for (Map.Entry<Integer, Integer> entry :
             mp.entrySet())
            queue.offer(entry);

        // Print the top k elements
        for (int i = 0; i < K; i++) {
            System.out.print(queue.poll().getKey() + " ");
        }
    }

    // Driver's Code
    public static void main(String[] args)
    {
        int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
        int N = arr.length;
        int K = 2;

        System.out.println(
            K + " numbers with most occurrences are:");
        // Function call
        print_N_mostFrequentNumber(arr, N, K);
    }
}

// This code is contributed by Shubham Kumar Shah
Python
# Python3 implementation to find k
# numbers with most occurrences in
# the given array
import heapq

# Function to print the k numbers with
# most occurrences


def print_N_mostFrequentNumber(arr, N, K):

    mp = dict()

    # Put count of all the distinct elements
    # in dictionary with element as the
    # key & count as the value.
    for i in range(0, N):
        if arr[i] not in mp:
            mp[arr[i]] = 0
        else:
            mp[arr[i]] += 1

    # Using heapq data structure
    heap = [(value, key) for key,
            value in mp.items()]

    # Get the top k elements
    largest = heapq.nlargest(K, heap)

    # Insert the data from the map to
    # the priority queue
    print(K, " numbers with most "
             "occurrences are:", sep="")

    # Print the top k elements
    for i in range(K):
        print(largest[i][1], end=" ")


# Driver's code
if __name__ == "__main__":

    arr = [3, 1, 4, 4, 5, 2, 6, 1]
    N = len(arr)
    K = 2

    # Function call
    print_N_mostFrequentNumber(arr, N, K)

# This code is contributed by MuskanKalra1
C#
// C# implementation to find k
// elements with max occurrence.

using System;
using System.Collections.Generic;
using System.Linq;

public class KFrequentNumbers {
    static void print_N_mostFrequentNumber(int[] arr, int N,
                                           int K)
    {
        Dictionary<int, int> mp
            = new Dictionary<int, int>();

        // 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]] = 0;
            mp[arr[i]]++;
        }

        // Create a Priority Queue
        // to sort based on the
        // count or on the key if the
        // count is same
        List<int> queue = mp.Keys.ToList();
        queue.Sort(delegate(int y, int x) {
            if (mp[x] == mp[y])
                return x.CompareTo(y);
            else
                return (mp[x]).CompareTo(mp[y]);
        });

        // Print the top k elements
        Console.WriteLine(
            K + " numbers with the most occurrences are:");
        for (int i = 0; i < K; i++) {
            Console.WriteLine(queue[i] + " ");
        }
    }

    // Driver's Code
    public static void Main(string[] args)
    {
        int[] arr = { 3, 1, 4, 4, 5, 2, 6, 1 };
        int N = arr.Length;
        int K = 2;

        // Function call
        print_N_mostFrequentNumber(arr, N, K);
    }
}

// This code is contributed by phasing17
Javascript
// Javascript implementation to find k
// elements with max occurrence.

function print_N_mostFrequentNumber(arr, N, K)
{    
    let mp = new Map();
    // Put count of all the
        // distinct elements in Map
        // with element as the key &
        // count as the value.
        for (let 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.has(arr[i]))
                mp.set(arr[i],0);
            
            mp.set(arr[i],
                   mp.get(arr[i]) + 1);
        }
 
        // Create a Priority Queue
        // to sort based on the
        // count or on the key if the
        // count is same
        let queue=[...mp];
        
        queue.sort(function(a,b){
            if(a[1]==b[1])
            {
                return b[0]-a[0];
            }
            else
            {
                return b[1]-a[1];
            }
        });
        
        console.log(K + " numbers with most "+"occurrences are: ")
        for(let i=0; i<K; i++)
        {
            console.log(queue[i][0]+" ");
        }
}

// Driver's Code
let arr = [3, 1, 4, 4, 5, 2, 6, 1];
let N = arr.length;
let K = 2;

// Function call
print_N_mostFrequentNumber(arr, N, K);

// This code is contributed by avanitrachhadiya2155

Output
2 numbers with most occurrences are:
4 1 

Time Complexity: O(K log D + D log D), where D is the count of distinct elements in the array. 

  • To remove the top of the priority queue O(log d) time is required, so if k elements are removed then O(k log d) time is required, and 
  • To construct a priority queue with D elements, O(D log D) time is required.

Auxiliary Space: O(D), where D is the count of distinct elements in the array. 

Find K most occurring elements in the given Array using Bucket Sort

  • Create a HashMap elementCount and store the count of the elements in the given array.
  • Create a 2D vector frequency of size N+1 to store the elements according to their frequencies.
  • Now initialize a variable count = 0.
  • While count < K:
    • Traverse the frequency vector from N till 0 and print the elements present in the vector and increment the count for each element.

Below is the implementation of above approach:

C++
// C++ program to find k numbers with most
// occurrences in the given array

#include <bits/stdc++.h>
using namespace std;

// Function to print the k numbers with most occurrences
void print_N_mostFrequentNumber(int arr[], int N, int K)
{
    // HashMap to store count of the elements
    unordered_map<int, int> elementCount;
    for (int i = 0; i < N; i++) {
        elementCount[arr[i]]++;
    }

    // Array to store the elements according
    // to their frequency
    vector<vector<int> > frequency(N + 1);

    // Inserting elements in the frequency array
    for (auto element : elementCount) {
        frequency[element.second].push_back(element.first);
    }

    int count = 0;
    cout << K << " numbers with most occurrences are:\n";

    for (int i = frequency.size() - 1; i >= 0; i--) {

        // if frequency is same,then take number with a
        // larger value
        // so,if more than 1 number present with same
        // frequency,then sort frequency[i] in descending
        // order
        if (frequency[i].size() > 1) {
            sort(frequency[i].begin(), frequency[i].end(),
                 greater<int>());
        }

        for (auto element : frequency[i]) {
            count++;
            cout << element << " ";

            // if K elements have been printed
            if (count >= K)
                return;
        }
    }

    return;
}

// Driver's code
int main()
{
    int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
    int N = sizeof(arr) / sizeof(arr[0]);
    int K = 2;

    // Function call
    print_N_mostFrequentNumber(arr, N, K);

    return 0;
}

// This code has been improved by shubhamm050402
Java
import java.util.*;
class Main {

    // Function to print the k numbers with most occurrences
    static void print_N_mostFrequentNumber(int arr[], int N,
                                           int K)
    {

        // HashMap to store count of the elements
        HashMap<Integer, Integer> elementCount
            = new HashMap<>();

        for (int i = 0; i < N; i++) {
            elementCount.put(
                arr[i],
                elementCount.getOrDefault(arr[i], 0) + 1);
        }

        // Array to store the elements according
        // to their frequency
        List<List<Integer> > frequency = new ArrayList<>();

        for (int i = 0; i < N + 1; i++) {
            frequency.add(new ArrayList<>());
        }

        // Inserting elements in the frequency array
        for (int element : elementCount.keySet()) {
            frequency.get(elementCount.get(element))
                .add(element);
        }

        int count = 0;
        System.out.println(
            K + " numbers with most occurrences are: ");

        for (int i = frequency.size() - 1; i >= 0; i--) {

            // if frequency is same,then take number with a
            // larger value
            // so,if more than 1 number present with same
            // frequency,then sort frequency[i] in
            // descending order
            if (frequency.get(i).size() > 1) {

                Collections.sort(
                    frequency.get(i),
                    Collections.reverseOrder());
            }

            for (int element : frequency.get(i)) {
                count++;
                System.out.print(element + " ");
                // if K elements have been printed
                if (count == K)
                    return;
            }
        }

        return;
    }

    public static void main(String[] args)
    {
        int arr[] = { 3, 1, 4, 4, 5, 2, 6, 1 };
        int N = arr.length;
        int K = 2;

        // Function call
        print_N_mostFrequentNumber(arr, N, K);
    }
}

// This code is contributed by shubhamm050402
Python
def print_N_mostFrequentNumber(arr, N, K):
    # HashMap to store count of the elements
    count = {}     
    
    # Array to store the elements according
    # to their frequency
    freq = [[] for i in range(len(arr) + 1)] 
    for n in arr:
        count[n] = 1 + count.get(n, 0)
    for n, c in count.items():
        freq[c].append(n)

    res = []
    # if K elements have been printed
    for i in range(len(freq)-1, 0, -1):
        for n in freq[i]:
            res.append(n)
            if len(res) == K:
                return res[-1::-1]


# Driver's code
if __name__ == "__main__":
    arr = [3, 1, 4, 4, 5, 2, 6, 1]
    N = len(arr)
    K = 2

    # Function call
    print(print_N_mostFrequentNumber(arr, N, K))
C#
// C# program to find k numbers with most
// occurrences in the given array
using System;
using System.Collections.Generic;
class GFG {
    // Function to print the k numbers with most occurrences
    static void print_N_mostFrequentNumber(int[] arr, int N,
                                           int K)
    {
        // HashMap to store count of the elements
        Dictionary<int, int> elementCount
            = new Dictionary<int, int>();
        for (int i = 0; i < N; i++) {
            if (elementCount.ContainsKey(arr[i])) {
                elementCount[arr[i]]++;
            }
            else {
                elementCount.Add(arr[i], 1);
            }
        }

        // Array to store the elements according
        // to their frequency
        List<int>[] frequency = new List<int>[ N + 1 ];
        for (int i = 0; i <= N; i++) {
            frequency[i] = new List<int>();
        }
        // Inserting elements in the frequency array
        foreach(
            KeyValuePair<int, int> element in elementCount)
        {
            frequency[element.Value].Add(element.Key);
        }

        int count = 0;
        Console.WriteLine(
            K + " numbers with most occurrences are:");

        for (int i = N; i >= 0; i--) {

            //   if frequency is same,then take number with
            //   a
            // larger value
            // so,if more than 1 number present with same
            // frequency,then sort frequency[i] in
            // descending order
            if (frequency[i].Count > 1) {
                frequency[i].Sort();
                frequency[i].Reverse();
            }

            foreach(int element in frequency[i])
            {
                count += 1;
                Console.Write(element + " ");
                // if K elements have been printed
                if (count == K)
                    return;
            }
        }

        return;
    }

    // Driver's code
    public static void Main(string[] args)
    {
        int[] arr = { 3, 1, 4, 4, 5, 2, 6, 1 };
        int N = 8;
        int K = 2;

        // Function call
        print_N_mostFrequentNumber(arr, N, K);
    }
}

// This code is contributed by shubhamm050402
Javascript
    // JavaScript program to find k numbers with most
    // occurrences in the given array

    // Function to print the k numbers with most occurrences
    function print_N_mostFrequentNumber(arr, N , K)
    {
    
        // HashMap to store count of the elements
        var elementCount = new Map();
        
        for(let i=0;i<N;i++){
            if(elementCount.has(arr[i])){
                var temp = elementCount.get(arr[i]);
                elementCount.set(arr[i], temp+1);
            }
            else{
                elementCount.set(arr[i], 1);
            }
        }
        
        // Array to store the elements according
        // to their frequency
        var frequency = new Array(N+1);
        
        for(let i=0;i<=N;i++){
            frequency[i] = new Array();
        }
        
        // Inserting elements in the frequency array
        for (const [key, value] of elementCount.entries()) {
            frequency[value].push(key);
        }
        
        let count = 0;
        console.log(K + " numbers with most occurrences are:" + "<br>");
        
        for(let i=N;i>=0;i--){
            for(var j=frequency[i].length-1;j>=0;j--){
                count++;
                console.log(frequency[i][j] + " ");
            }
            // if K elements have been printed
            if(count==K){
                return;
            }
        }
        return;
    }

    let arr = [ 3, 1, 4, 4, 5, 2, 6, 1 ];
    let N = arr.length;
    let K = 2;
    
    // Function call
    print_N_mostFrequentNumber(arr, N, K);
    
    // This code is contributed by lokeshmvs21.

Output
2 numbers with most occurrences are:
4 1 

Time Complexity: O(N logN), where N is the size of the given array. worst case is when all the elements are the same, we are sorting the entire vector.
Auxiliary Space: O(N)

Find K most occurring elements in the given Array using Quick Select:

In quick select we partition the array of unique numbers in such a way that the elements to the left of pivotpivotpivot are more frequent than pivot, and elements to the right of pivotare less frequent than pivot. Thus we can say the pivotis in its sorted position. We randomly chose such pivot until we finally find its sorted position to be K. Then we know that all the elements to the left of pivot are more frequent than pivotand each time we reduce our paritioning space w.r.t the pivot.

Partition Algorithm
Let’s imagine the pivot at store_point. If the iiith element is more frequent than pivot, then the ith element will be on the left of pivot, but the store_point is instead holding an element which is either equally or less frequent than pivot, so it should go to the right of pivot. Hence, we swap the two elements and move store_point forward so that the more frequent element is on the left. If iiith element is less frequent than pivot we assume pivot is at its right place and don’t move store_point .
At the end we swap store_point with pivot and return the sorted index.

C++
// C++ program to find k numbers with most
// occurrences in the given array

#include <bits/stdc++.h>
using namespace std;

vector<int> print_N_mostFrequentNumber(vector<int>& nums,
                                       int k,
                                       vector<int>& out)
{
    // map for counting the number of
    // occurences
    unordered_map<int, int> counts;
    // stroing the frequency of each element
    for (int num : nums)
        ++counts[num];
    // creating a vector for storing the
    // frequency
    vector<pair<int, int> > freqs;
    for (auto vt : counts)
        freqs.push_back({ vt.second, vt.first });
    // using the user defined function
    //  nth_element to extract the values
    nth_element(freqs.begin(), freqs.end() - k,
                freqs.end());
    // using user defined function transform
    // to make the desired changes
    transform(freqs.end() - k, freqs.end(), out.begin(),
              [](pair<int, int> vt) { return vt.second; });
    // store the result in the out vector
    return out;
}

// Driver's code
int main()
{
    vector<int> arr{ 3, 1, 4, 4, 5, 2, 6, 1 };
    int K = 2;

    // Function call
    vector<int> ans(K);
    print_N_mostFrequentNumber(arr, K, ans);
    cout << K
         << " numbers with most occurences are : " << endl;
    for (int i = ans.size() - 1; i >= 0; i--) {
        cout << ans[i] << " ";
    }

    return 0;
}
Java
// JAVA program to find k numbers with most
// occurrences in the given array

import java.util.*;

class Main {
    static List<Integer>
    print_N_mostFrequentNumber(List<Integer> nums, int k,
                               List<Integer> out)
    {
        // Map for counting the number of occurrences
        Map<Integer, Integer> counts = new HashMap<>();
        // Storing the frequency of each element
        for (int num : nums)
            counts.put(num,
                       counts.getOrDefault(num, 0) + 1);
        // Creating a list for storing the frequency
        List<Map.Entry<Integer, Integer> > freqs
            = new ArrayList<>(counts.entrySet());
        // Using the user-defined function Collections.sort
        // to sort by frequency
        Collections.sort(
            freqs, (a, b) -> b.getValue() - a.getValue());
        // Adding the k most frequent numbers to the output
        // list
        for (int i = 0; i < k; i++)
            out.add(freqs.get(i).getKey());
        // Returning the result in the out list
        return out;
    }

    // Driver's code
    public static void main(String[] args)
    {
        List<Integer> arr = new ArrayList<>(
            Arrays.asList(3, 1, 4, 4, 5, 2, 6, 1));
        int k = 2;

        // Function call
        List<Integer> ans = new ArrayList<>(k);
        print_N_mostFrequentNumber(arr, k, ans);
        System.out.println(
            k + " numbers with most occurrences are:");
        for (int i = ans.size() - 1; i >= 0; i--) {
            System.out.print(ans.get(i) + " ");
        }
    }
}

// This code is contributed by shivamgupta0987654321
Python
# Python3 program to find k numbers with most
# occurrences in the given array

from collections import Counter


def print_N_mostFrequentNumber(nums, k, out):
    # Count the occurrences of each number
    counts = Counter(nums)

    # Get the k numbers with the highest occurrences
    most_frequent = counts.most_common(k)

    # Extract the numbers from the most frequent pairs
    numbers = [num for num, _ in most_frequent]

    # Store the numbers in the output list
    for i, num in enumerate(numbers):
        out[i] = num

    return out


# Driver's code
arr = [3, 1, 4, 4, 5, 2, 6, 1]
K = 2

# Function call
ans = [0] * K
print_N_mostFrequentNumber(arr, K, ans)
print(K, "numbers with most occurrences are:")
print(ans[::-1])
C#
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    // Function to find k numbers with most occurrences in the given array
    static List<int> PrintNMostFrequentNumber(List<int> nums, int k)
    {
        // Dictionary for counting the number of occurrences
        Dictionary<int, int> counts = new Dictionary<int, int>();

        // Storing the frequency of each element
        foreach (int num in nums)
        {
            if (counts.ContainsKey(num))
                counts[num]++;
            else
                counts[num] = 1;
        }

        // Creating a list to store the frequency
        List<Tuple<int, int>> freqs = new List<Tuple<int, int>>();
        foreach (var kvp in counts)
        {
            freqs.Add(new Tuple<int, int>(kvp.Value, kvp.Key));
        }

        // Using the user-defined function (CustomNthElement) to extract the values
        CustomNthElement(freqs, k);

        // Using user-defined function Transform to make the desired changes
        List<int> outList = freqs.GetRange(freqs.Count - k, k).Select(t => t.Item2).ToList();

        // Return the result
        return outList;
    }

    // Custom implementation of nth_element
    static void CustomNthElement(List<Tuple<int, int>> freqs, int k)
    {
        int left = 0;
        int right = freqs.Count - 1;

        while (left <= right)
        {
            int pivot = Partition(freqs, left, right);
            if (pivot == freqs.Count - k)
                return;
            else if (pivot < freqs.Count - k)
                left = pivot + 1;
            else
                right = pivot - 1;
        }
    }

    // Partition function for the custom nth_element
    static int Partition(List<Tuple<int, int>> freqs, int left, int right)
    {
        int pivot = freqs[right].Item1;
        int i = left;

        for (int j = left; j < right; j++)
        {
            if (freqs[j].Item1 <= pivot)
            {
                Swap(freqs, i, j);
                i++;
            }
        }

        Swap(freqs, i, right);
        return i;
    }

    // Helper function to swap elements in the list
    static void Swap(List<Tuple<int, int>> freqs, int i, int j)
    {
        Tuple<int, int> temp = freqs[i];
        freqs[i] = freqs[j];
        freqs[j] = temp;
    }

    static void Main(string[] args)
    {
        List<int> arr = new List<int> { 3, 1, 4, 4, 5, 2, 6, 1 };
        int K = 2;

        // Function call
        List<int> ans = PrintNMostFrequentNumber(arr, K);
        Console.WriteLine(K + " numbers with most occurrences are : ");
        for (int i = ans.Count - 1; i >= 0; i--)
        {
            Console.Write(ans[i] + " ");
        }
    }
}
Javascript
function printNMostFrequentNumber(nums, k, out) {
    // Count the occurrences of each number
    let counts = new Map();
    for (let num of nums) {
        counts.set(num, (counts.get(num) || 0) + 1);
    }

    // Get the k numbers with the highest occurrences
    let mostFrequent = Array.from(counts.entries()).sort((a, b) => b[1] - a[1]).slice(0, k);

    // Extract the numbers from the most frequent pairs
    let numbers = mostFrequent.map(([num, _]) => num);

    // Store the numbers in the output array
    for (let i = 0; i < numbers.length; i++) {
        out[i] = numbers[i];
    }

    return out;
}

// Driver's code
let arr = [3, 1, 4, 4, 5, 2, 6, 1];
let K = 2;

// Function call
let ans = new Array(K).fill(0);
printNMostFrequentNumber(arr, K, ans);
console.log(`${K} numbers with most occurrences are:`);
console.log(ans.reverse());

Output
2 numbers with most occurences are : 
4 1 

Time complexity:  O(n)
Auxiliary Space: O(N)



Previous Article
Next Article

Similar Reads

Find GCD of most occurring and least occurring elements of given Array
Given an array arr[] of size n, The task is to find the GCD of the highest and lowest frequency element in the given array. Examples: Input: arr[] = {2, 2, 4, 4, 5, 5, 6, 6, 6, 6}Output: 2Explanation: The frequency of the elements in the above array is freq(2) = 2, freq(4) = 2, freq(5) = 2, freq(6) = 4, The minimum frequency is 2 (of elements 2, 4,
7 min read
Find Kth most occurring element in an Array
Given an array of integers arr[] of size N and a number K, the task is to find the Kth most occurring element in this array.Note: If there are more than one numbers in the array with the same frequency, then both are considered to be at the same level of occurrence. Therefore print both the numbers. Examples: Input: arr[] = {1, 2, 2, 2, 4, 4, 4, 5,
11 min read
Python program to find the most occurring character and its count
Given a string, write a python program to find the most occurrence character and its number of occurrences. Examples: Input : hello Output : ('l', 2) Input : geeksforgeeks Output : ('e', 4) We can solve this problem quickly in python using Counter() method. Simple Approach is to 1) Create a dictionary using Counter method having strings as keys and
3 min read
Minimize splits in given Array to find subsets of at most 2 elements with sum at most K
Given an array arr[] of N integers and an integer K, the task is to calculate the minimum number of subsets of almost 2 elements the array can be divided such that the sum of elements in each subset is almost K. Examples: Input: arr[] = {1, 2, 3}, K = 3Output: 2Explanation: The given array can be divided into subsets as {1, 2} and {3}, and the sum
6 min read
Print the most occurring character in an array of strings
Given an array arr[] of lowercase strings, the task is to print the most occurring character in the set of strings.Examples: Input: arr[] = {"animal", "zebra", "lion", "giraffe"} Output: a Explanation: The frequency of 'a' is 4 which is highest. Input: arr[] = {"aa", "bb", "cc", "bde"} Output: b Approach: The idea is to implement a hash data struct
5 min read
Find the sum of all highest occurring elements in an Array
Given an array of integers containing duplicate elements. The task is to find the sum of all highest occurring elements in the given array. That is the sum of all such elements whose frequency is maximum in the array.Examples: Input : arr[] = {1, 1, 2, 2, 2, 2, 3, 3, 3, 3} Output : 20 The highest occurring elements are 3 and 2 and their frequency i
6 min read
Find all array elements occurring more than ⌊N/3⌋ times
Given an array arr[] consisting of N integers, the task is to find all the array elements which occurs more than floor (n/3) times. Examples: Input: arr[] = {5, 3, 5}Output: 5Explanation:The frequency of 5 is 2, which is more than N/3(3/3 = 1). Input: arr[] = {7, 7, 7, 3, 4, 4, 4, 5}Output: 4 7Explanation:The frequency of 7 and 4 in the array is 3,
15+ min read
Find even occurring elements in an array of limited range
Given an array that contains odd number of occurrences for all numbers except for a few elements which are present even number of times. Find the elements which have even occurrences in the array in O(n) time complexity and O(1) extra space. Assume array contain elements in the range 0 to 63. Examples : Input: [9, 12, 23, 10, 12, 12, 15, 23, 14, 12
8 min read
Count substrings with each character occurring at most k times
Given a string S. Count number of substrings in which each character occurs at most k times. Assume that the string consists of only lowercase English alphabets. Examples: Input : S = ab k = 1 Output : 3 All the substrings a, b, ab have individual character count less than 1. Input : S = aaabb k = 2 Output : 12 Substrings that have individual chara
15+ min read
Count of palindromic strings of size upto N consisting of first K alphabets occurring at most twice
Given two integers N and K, the task is to find the number of palindromic strings of size at most N consisting of the first K lowercase alphabets such that each character in a string doesn't appear more than twice. Examples: Input: N = 3, K = 2Output: 6Explanation:The possible strings are:"a", "b", "aa", "bb", "aba", "bab". Input: N = 4, K = 3Outpu
9 min read
Article Tags :
Practice Tags :