Top K Frequent Elements Heap DSA Solution - Study Chapter | QuizMaker

Top K Frequent Elements explained with full sort brute force, optimized frequency heap, dry run, edge cases, complexity, and Python, C++, Java code.

Read
12m
Type
Chapter
Access
Free

Course

DSA Course: Interview Patterns and Problem Solving

Topic

Module 12: Heap & Priority Queue

Learning Outcome

After this lesson, you should be able to combine a frequency map with a size-k heap to rank values.

Problem Statement

Given an integer array and k, return the k elements that appear most frequently.

InputOutputWhy
nums = [1,1,1,2,2,3], k = 2[1,2]1 appears three times and 2 appears twice.

Brute Force Approach

Count frequencies, then sort every unique value by frequency. This works but costs extra sorting time.

Optimized Approach

Count frequencies and maintain a min-heap of size k by frequency. The heap discards lower-frequency values.

Exact Pseudocode

freq = value counts
heap = empty min heap by frequency
for each value and count:
  push (count, value)
  if heap size is greater than k:
    pop smallest frequency
return values from heap

Reference Code

import heapq
from collections import Counter

class Solution:
    def topKFrequent(self, nums, k):
        heap = []
        for value, count in Counter(nums).items():
            heapq.heappush(heap, (count, value))
            if len(heap) > k:
                heapq.heappop(heap)
        return [value for count, value in heap]
class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> freq;
        for (int x : nums) freq[x]++;

        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap;
        for (auto& entry : freq) {
            int value = entry.first;
            int count = entry.second;
            heap.push({count, value});
            if (heap.size() > k) heap.pop();
        }

        vector<int> answer;
        while (!heap.empty()) {
            answer.push_back(heap.top().second);
            heap.pop();
        }
        return answer;
    }
};
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> freq = new HashMap<>();
        for (int x : nums) freq.put(x, freq.getOrDefault(x, 0) + 1);

        PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> Integer.compare(a[0], b[0]));
        for (Map.Entry<Integer, Integer> entry : freq.entrySet()) {
            heap.offer(new int[] {entry.getValue(), entry.getKey()});
            if (heap.size() > k) heap.poll();
        }

        int[] answer = new int[k];
        for (int i = 0; i < k; i++) answer[i] = heap.poll()[1];
        return answer;
    }
}

Sample Dry Run

StepStateResult
Count1:3, 2:2, 3:1Frequency map ready
Push 1 and 2heap size is 2Both remain
Push 3frequency 1 is smallest3 is popped
Returnheap has 1 and 2top k frequent values

Complexity

MeasureValueReason
TimeO(n + m log k)n counts input values and m unique values are processed by the heap.
SpaceO(m)The frequency map stores m values and the heap stores k values.

Edge Cases

Interview Checklist

FAQs

Why use a min-heap?

The smallest frequency among the current top k should be easiest to remove.

What does m mean?

m is the number of unique values in the input.

What is the core pattern?

Frequency map plus size-k heap.

Tags

Open on QuizMaker