📖 Scenario: You are working on a music app that tracks how many times each song is played. You want to find the top k most played songs to show on the homepage.
🎯 Goal: Build a program that finds the top k frequent elements from a list of numbers using a heap data structure.
📋 What You'll Learn
Create a frequency map of elements from the given array
Use a min-heap to keep track of top k frequent elements
Extract the top k elements from the heap
Print the result array of top k frequent elements
💡 Why This Matters
🌍 Real World
Finding the most popular items, songs, or search queries is common in apps and websites to personalize content or show trending data.
💼 Career
Understanding frequency counting and heap data structures is important for software engineers working on recommendation systems, search engines, and data analytics.
Progress0 / 4 steps
1
Create the frequency map
Create a dictionary called frequencyMap that counts how many times each number appears in the array nums which is [1,1,1,2,2,3].
DSA Javascript
Hint
Use a for...of loop to go through nums. For each number, add or update its count in frequencyMap.
2
Set the value of k
Create a variable called k and set it to 2 to find the top 2 frequent elements.
DSA Javascript
Hint
Just create a constant k and assign it the value 2.
3
Use a min-heap to find top k frequent elements
Create an empty array called minHeap to act as a min-heap. Then, iterate over frequencyMap entries using for (const [num, freq] of Object.entries(frequencyMap)). For each entry, push an object {num: Number(num), freq} into minHeap. If minHeap.length exceeds k, remove the element with the smallest frequency. Use a helper function heapify() to maintain the min-heap property after each insertion or removal. Implement heapify() inside the code to keep the smallest frequency element at the root.
DSA Javascript
Hint
Use an array minHeap and sort it by frequency after each insertion. Remove the smallest frequency element if size exceeds k.
4
Print the top k frequent elements
Create an array called result by mapping minHeap to extract only the num values. Then, print result using console.log(result).
DSA Javascript
Hint
Map minHeap to get only the num values and print the array.
Practice
(1/5)
1. What is the main purpose of using a heap in the Top K Frequent Elements problem?
easy
A. To store elements without any order
B. To sort all elements in ascending order
C. To remove duplicates from the list
D. To efficiently keep track of the top K elements by frequency
Solution
Step 1: Understand the problem goal
The goal is to find the K elements that appear most frequently in a list.
Step 2: Role of heap in this context
A heap helps keep track of the top K frequent elements efficiently by always having the smallest frequency at the root, so less frequent elements can be removed quickly.
Final Answer:
To efficiently keep track of the top K elements by frequency -> Option D
Quick Check:
Heap = Efficient top K tracking [OK]
Hint: Heap keeps smallest frequency on top for quick removal [OK]
Common Mistakes:
Thinking heap sorts all elements fully
Confusing heap with simple array storage
Assuming heap removes duplicates automatically
2. Which of the following is the correct way to create a min-heap in JavaScript using a priority queue for frequencies?
easy
A. const heap = new MinHeap(x => x.frequency);
B. const heap = new PriorityQueue(x => x.frequency);
C. const heap = new MinPriorityQueue({ priority: x => x.frequency });
D. const heap = new PriorityQueue({ compare: (a,b) => a.frequency - b.frequency });
Solution
Step 1: Identify correct syntax for min-heap in JavaScript
Using the standard library or popular libraries, MinPriorityQueue with a priority function is the correct way.
Step 2: Check options for correct constructor and priority function
const heap = new MinPriorityQueue({ priority: x => x.frequency }); uses new MinPriorityQueue({ priority: x => x.frequency }), which is the correct modern syntax.
Final Answer:
const heap = new MinPriorityQueue({ priority: x => x.frequency }); -> Option C
Quick Check:
MinPriorityQueue with priority function = const heap = new MinPriorityQueue({ priority: x => x.frequency }); [OK]
Hint: Use MinPriorityQueue with priority callback for min-heap [OK]
Common Mistakes:
Using PriorityQueue without specifying min or max
Passing compare function incorrectly
Using non-existent MinHeap constructor
3. What will be the output of the following code snippet?
const nums = [1,1,1,2,2,3];
const k = 2;
// Frequency map
const freqMap = new Map();
for (const num of nums) {
freqMap.set(num, (freqMap.get(num) || 0) + 1);
}
// Min heap simulation using array and sort
const heap = [];
for (const [num, freq] of freqMap.entries()) {
heap.push([num, freq]);
heap.sort((a, b) => a[1] - b[1]);
if (heap.length > k) heap.shift();
}
const result = heap.map(x => x[0]);
console.log(result);
4. Identify the bug in this code snippet for finding top K frequent elements:
const nums = [4,4,4,6,6,7];
const k = 2;
const freqMap = new Map();
for (const num of nums) {
freqMap.set(num, freqMap.get(num) + 1);
}
const heap = [];
for (const [num, freq] of freqMap.entries()) {
heap.push([num, freq]);
heap.sort((a, b) => a[1] - b[1]);
if (heap.length > k) heap.shift();
}
const result = heap.map(x => x[0]);
console.log(result);
medium
A. freqMap.get(num) + 1 causes error when key is missing
B. Heap sorting should be descending, not ascending
C. k should be larger than array length
D. Using Map instead of Object for frequency map
Solution
Step 1: Check frequency map update logic
freqMap.get(num) + 1 fails when num is not yet in map, because freqMap.get(num) returns undefined, causing NaN.
Step 2: Correct way to update frequency
Use freqMap.get(num) || 0 to default to 0 if key missing, then add 1.
Final Answer:
freqMap.get(num) + 1 causes error when key is missing -> Option A
Quick Check:
Undefined + 1 = NaN error [OK]
Hint: Always default missing map keys to 0 before adding [OK]
Common Mistakes:
Not initializing frequency count
Sorting heap in wrong order
Misunderstanding Map vs Object usage
5. Given an array nums = [5,3,1,1,1,3,73,1] and k = 2, which approach correctly returns the top K frequent elements using a min-heap? Choose the best code snippet.
A:
const freqMap = new Map();
for (const n of nums) freqMap.set(n, (freqMap.get(n) || 0) + 1);
const heap = [];
for (const [num, freq] of freqMap.entries()) {
heap.push([num, freq]);
heap.sort((a,b) => a[1] - b[1]);
if (heap.length > k) heap.shift();
}
return heap.map(x => x[0]);
B:
const freqMap = {};
for (const n of nums) freqMap[n] = freqMap[n] + 1;
const heap = new MinPriorityQueue({ priority: x => x[1] });
for (const [num, freq] of Object.entries(freqMap)) {
heap.enqueue([num, freq]);
if (heap.size() > k) heap.dequeue();
}
const result = [];
while (!heap.isEmpty()) result.push(heap.dequeue()[0]);
return result;
C:
const freqMap = new Map();
for (const n of nums) freqMap.set(n, freqMap.get(n) + 1);
const heap = [];
for (const [num, freq] of freqMap.entries()) {
heap.push([num, freq]);
heap.sort((a,b) => b[1] - a[1]);
if (heap.length > k) heap.pop();
}
return heap.map(x => x[0]);
D:
const freqMap = new Map();
for (const n of nums) freqMap.set(n, (freqMap.get(n) || 0) + 1);
const heap = new MaxPriorityQueue({ priority: x => x[1] });
for (const [num, freq] of freqMap.entries()) {
heap.enqueue([num, freq]);
if (heap.size() > k) heap.dequeue();
}
const result = [];
while (!heap.isEmpty()) result.push(heap.dequeue()[0]);
return result;
hard
A. Option A is correct and uses array sort as min-heap simulation
B. Option B is correct using MinPriorityQueue with proper frequency map
C. Option C is correct using max-heap and popping largest frequency
D. Option D is correct using MaxPriorityQueue but removes wrong elements