Kth Largest Element Using Max Heap in DSA Javascript - Time & Space Complexity
We want to understand how long it takes to find the kth largest number using a max heap.
How does the time needed grow when the list gets bigger?
Analyze the time complexity of the following code snippet.
function findKthLargest(nums, k) {
const maxHeap = new MaxHeap();
for (const num of nums) {
maxHeap.insert(num);
}
let result;
for (let i = 0; i < k; i++) {
result = maxHeap.extractMax();
}
return result;
}
This code builds a max heap from the array, then extracts the largest element k times to find the kth largest.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Inserting all n elements into the max heap and extracting the max k times.
- How many times: Insert runs n times; extractMax runs k times.
As the input size n grows, building the heap takes more time, and extracting k times adds more steps.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 insertions + k extractions |
| 100 | About 100 insertions + k extractions |
| 1000 | About 1000 insertions + k extractions |
Insertion cost grows roughly with n log n, extraction cost grows with k log n, so total grows with both n and k.
Time Complexity: O(n log n + k log n)
This means the time grows mostly by inserting all elements and then extracting k times, each step taking logarithmic time.
[X] Wrong: "Building the heap is just O(n), so total time is O(n + k)."
[OK] Correct: Building a heap by inserting elements one by one costs O(n log n), not O(n), because each insert takes log n time. So total time is higher.
Understanding this time complexity helps you explain why heap-based solutions are efficient and when they are better than sorting the whole list.
"What if we used a min heap of size k instead of a max heap of size n? How would the time complexity change?"
Practice
kth largest element using a max heap?Solution
Step 1: Understand max heap property
A max heap always keeps the largest element at the root, so extracting the root gives the largest element.Step 2: Extract max
By removing the rootktimes to get thekthlargestktimes, the last extracted element is thekthlargest.Final Answer:
Build max heap and extract maxktimes -> Option AQuick Check:
Max heap extraction =kthlargest element [OK]
k times to find kth largest [OK]- Using min heap instead of max heap
- Sorting and picking wrong index
- Extracting fewer or more than
ktimes
arr in JavaScript using a custom heap class?Solution
Step 1: Recognize typical max heap initialization
Usually, a max heap class accepts an array and has a method likebuildHeap()to create the heap structure.Step 2: Identify correct method call
buildHeap()is the standard method to convert the array into a max heap, so calling it after initialization is correct.Final Answer:
const maxHeap = new MaxHeap(arr); maxHeap.buildHeap(); -> Option DQuick Check:
buildHeap() builds max heap from array [OK]
- Calling insert with whole array instead of single elements
- Using wrong method names like heapify or build
- Not calling any method to build the heap
class MaxHeap {
constructor(arr) {
this.heap = arr;
this.buildHeap();
}
buildHeap() {
for (let i = Math.floor(this.heap.length / 2) - 1; i >= 0; i--) {
this.heapify(i);
}
}
heapify(i) {
let largest = i;
let left = 2 * i + 1;
let right = 2 * i + 2;
if (left < this.heap.length && this.heap[left] > this.heap[largest]) largest = left;
if (right < this.heap.length && this.heap[right] > this.heap[largest]) largest = right;
if (largest !== i) {
[this.heap[i], this.heap[largest]] = [this.heap[largest], this.heap[i]];
this.heapify(largest);
}
}
extractMax() {
if (this.heap.length === 0) return null;
const max = this.heap[0];
this.heap[0] = this.heap.pop();
this.heapify(0);
return max;
}
}
const arr = [3, 2, 1, 5, 6, 4];
const maxHeap = new MaxHeap(arr);
let kthLargest;
for (let i = 0; i < 2; i++) {
kthLargest = maxHeap.extractMax();
}
console.log(kthLargest);Solution
Step 1: Build max heap from array
Array [3,2,1,5,6,4] becomes max heap with root 6 after buildHeap.Step 2: Extract max twice
First extractMax returns 6, second extractMax returns 5, sokthLargestafter loop is 5.Final Answer:
5 -> Option BQuick Check:
2nd largest element = 5 [OK]
- Assuming heap root changes incorrectly after extraction
- Confusing 1st largest with 2nd largest
- Not updating heap after extraction
class MaxHeap {
constructor(arr) {
this.heap = arr;
this.buildHeap();
}
buildHeap() {
for (let i = 0; i < this.heap.length / 2; i++) {
this.heapify(i);
}
}
heapify(i) {
let largest = i;
let left = 2 * i + 1;
let right = 2 * i + 2;
if (left < this.heap.length && this.heap[left] > this.heap[largest]) largest = left;
if (right < this.heap.length && this.heap[right] > this.heap[largest]) largest = right;
if (largest !== i) {
[this.heap[i], this.heap[largest]] = [this.heap[largest], this.heap[i]];
this.heapify(largest);
}
}
extractMax() {
if (this.heap.length === 0) return null;
const max = this.heap[0];
this.heap[0] = this.heap.pop();
this.heapify(0);
return max;
}
}
const arr = [7, 10, 4, 3, 20, 15];
const maxHeap = new MaxHeap(arr);
let kthLargest;
for (let i = 0; i < 3; i++) {
kthLargest = maxHeap.extractMax();
}
console.log(kthLargest);Solution
Step 1: Analyze buildHeap loop direction
Heap building requires heapify calls from last parent to root, so loop must run backwards from middle to 0.Step 2: Identify incorrect loop direction
Current loop runs forwards, which does not correctly heapify the tree, causing incorrect heap structure.Final Answer:
The buildHeap loop should run backwards from middle to 0 -> Option AQuick Check:
buildHeap loop direction = backwards [OK]
- Running buildHeap loop forwards
- Not calling heapify after extractMax
- Swapping with wrong child in heapify
arr = [12, 3, 5, 7, 19, 0, 4], write a JavaScript function using a max heap to find the 4th largest element. What is the output of your function?Solution
Step 1: Build max heap from array
Array becomes max heap with root 19 after heapify.Step 2: Extract max 4 times
Extracted elements in order: 19, 12, 7, 5. The 4th largest is 7.Final Answer:
7 -> Option CQuick Check:
4th largest element = 7 [OK]
k times; last extracted is kth largest [OK]- Extracting fewer times than
k - Confusing 3rd largest with 4th largest
- Not rebuilding heap after extraction
Ready to prove it?
Pass the test and this pattern moves unknown
