📖 Scenario: Imagine you run a small online store. You want to find the top k products that customers buy most often. This helps you know which products to promote or stock more.
🎯 Goal: You will write a program to find the k most frequent elements from a list of product IDs using a heap (priority queue).
📋 What You'll Learn
Create an array called products with given product IDs.
Create a variable called k to store how many top products to find.
Use a Map to count frequencies of each product.
Use a min-heap (priority queue) to keep track of top k frequent products.
Print the array of top k frequent product IDs.
💡 Why This Matters
🌍 Real World
Finding the most popular products helps businesses focus on best sellers and improve sales.
💼 Career
This technique is useful in data analysis, recommendation systems, and any job involving frequency analysis or priority queues.
Progress0 / 4 steps
1
Create the product list
Create an array called products with these exact product IDs: 3, 1, 4, 4, 5, 3, 3, 1, 6, 4
DSA Typescript
Hint
Use const products = [3, 1, 4, 4, 5, 3, 3, 1, 6, 4]; to create the array.
2
Set the number of top products to find
Create a variable called k and set it to 3 to find the top 3 frequent products.
DSA Typescript
Hint
Use const k = 3; to set the number of top products.
3
Count frequencies and find top k using a min-heap
Create a Map called freqMap to count frequencies of each product in products. Then create a min-heap using an array called minHeap to keep top k frequent products. Use a helper function heapify to maintain the heap property. Insert products into minHeap based on frequency and remove the smallest frequency when size exceeds k.
DSA Typescript
Hint
Use a Map to count frequencies. Use an array as a min-heap and a heapify function to keep smallest frequency on top. Push each product-frequency pair and remove smallest when heap size exceeds k.
4
Print the top k frequent products
Create an array called topK that extracts product IDs from minHeap. Then print topK.
DSA Typescript
Hint
Use minHeap.map(item => item[0]) to get product IDs. Then 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 frequent 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 efficiently keep track of the top K elements by frequency without sorting the entire list.
Final Answer:
To efficiently keep track of the top K frequent elements by frequency -> Option D
Quick Check:
Heap = Efficient top K tracking [OK]
Hint: Heap keeps top K elements efficiently by frequency [OK]
Common Mistakes:
Thinking heap sorts all elements fully
Confusing heap with simple array storage
Assuming heap removes duplicates
2. Which of the following TypeScript code snippets correctly initializes a min-heap to store pairs of [frequency, element] for the Top K Frequent Elements problem?
easy
A. const minHeap = new MinPriorityQueue<{freq: number, val: number}>({priority: x => x.freq});
TypeScript with modern libraries uses MinPriorityQueue with a priority function for min-heap.
Step 2: Check each option
const minHeap = new MinPriorityQueue<{freq: number, val: number}>({priority: x => x.freq}); correctly creates a min-heap with priority based on frequency. Others are arrays, maps, or sets which do not provide heap behavior.
Final Answer:
const minHeap = new MinPriorityQueue<{freq: number, val: number}>({priority: x => x.freq}); -> Option A
Quick Check:
MinPriorityQueue with priority function = correct heap [OK]
Hint: Use MinPriorityQueue with priority function for min-heap [OK]
Common Mistakes:
Using Array instead of heap
Using Map or Set which are not heaps
Missing priority function in heap initialization
3. What will be the output of the following TypeScript code snippet for nums = [1,1,1,2,2,3] and k = 2?
function topKFrequent(nums: number[], k: number): number[] {
const freqMap = new Map();
for (const num of nums) {
freqMap.set(num, (freqMap.get(num) || 0) + 1);
}
const minHeap = new MinPriorityQueue<{val: number, freq: number}>({priority: x => x.freq});
for (const [num, freq] of freqMap.entries()) {
minHeap.enqueue({val: num, freq});
if (minHeap.size() > k) {
minHeap.dequeue();
}
}
const result = [];
while (minHeap.size() > 0) {
result.push(minHeap.dequeue().element.val);
}
return result.reverse();
}
console.log(topKFrequent([1,1,1,2,2,3], 2));
Step 2: Use min-heap to keep top 2 frequent elements
Insert (1,3), (2,2), (3,1). When size > 2, remove smallest freq. So 3 with freq 1 is removed.
Step 3: Extract elements from heap and reverse
Heap contains (1,3) and (2,2). Extracted order reversed gives [1, 2].
Final Answer:
[1, 2] -> Option B
Quick Check:
Top 2 frequent = [1, 2] [OK]
Hint: Keep heap size ≤ k, remove smallest frequency [OK]
Common Mistakes:
Not reversing result array
Removing wrong element from heap
Confusing frequency counts
4. Identify the bug in the following TypeScript code for finding top K frequent elements:
function topKFrequent(nums: number[], k: number): number[] {
const freqMap = new Map();
for (const num of nums) {
freqMap.set(num, freqMap.get(num) + 1);
}
const minHeap = new MinPriorityQueue<{val: number, freq: number}>({priority: x => x.freq});
for (const [num, freq] of freqMap.entries()) {
minHeap.enqueue({val: num, freq});
if (minHeap.size() > k) {
minHeap.dequeue();
}
}
const result = [];
while (minHeap.size() > 0) {
result.push(minHeap.dequeue().element.val);
}
return result.reverse();
}
medium
A. Map should be replaced with Set
B. minHeap.dequeue() removes wrong element
C. freqMap.get(num) + 1 causes error when num not in map
D. result.reverse() is unnecessary
Solution
Step 1: Check frequency map update line
freqMap.get(num) returns undefined if num not present, so undefined + 1 causes NaN.
Step 2: Correct way to update frequency
Use freqMap.get(num) || 0 to default to 0 if undefined, then add 1.
Final Answer:
freqMap.get(num) + 1 causes error when num not in map -> Option C
Quick Check:
Undefined + 1 = NaN error [OK]
Hint: Use (freqMap.get(num) || 0) + 1 to avoid undefined [OK]
Common Mistakes:
Not handling undefined in map get
Removing wrong element from heap
Thinking reverse is unnecessary
Replacing Map with Set incorrectly
5. Given a large array nums with many elements having the same frequency, how can you modify the heap approach to ensure the Top K Frequent Elements always returns the smallest elements when frequencies tie? Choose the best approach.
hard
A. Use a heap with priority comparing frequency first, then element value to break ties
B. Sort the entire array before building the heap
C. Use a max-heap instead of a min-heap without tie-break logic
D. Ignore tie cases as they do not affect the result
Solution
Step 1: Understand tie frequency problem
When multiple elements share frequency, we want consistent ordering by element value.
Step 2: Modify heap priority to handle ties
Use a comparator that first compares frequency, then element value to break ties, ensuring smallest elements come first.
Step 3: Why other options fail
Sorting entire array is inefficient; max-heap without tie-break can give inconsistent results; ignoring ties causes unpredictable output.
Final Answer:
Use a heap with priority comparing frequency first, then element value to break ties -> Option A
Quick Check:
Priority with tie-break = correct tie handling [OK]
Hint: Add tie-break by element value in heap priority [OK]
Common Mistakes:
Sorting entire array wastes time
Ignoring tie-break leads to wrong output
Using max-heap without tie-break causes inconsistency
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.