Kth Largest Element Using Max Heap in DSA Java - Time & Space Complexity
We want to know how the time needed to find the kth largest number grows as the list gets bigger.
How does the number of steps change when we use a max heap for this task?
Analyze the time complexity of the following code snippet.
import java.util.PriorityQueue;
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
for (int num : nums) {
maxHeap.offer(num);
}
for (int i = 1; i < k; i++) {
maxHeap.poll();
}
return maxHeap.peek();
}
This code builds a max heap from the array, then removes the largest elements k-1 times to find the kth largest.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Adding all elements to the max heap and removing the top element multiple times.
- How many times: Adding happens n times (once per element), removing happens k-1 times.
Adding each element to the heap takes a bit more time as the heap grows, and removing elements also takes time.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 insertions + up to k removals, each taking a few steps. |
| 100 | About 100 insertions + up to k removals, each a bit longer. |
| 1000 | About 1000 insertions + up to k removals, each longer still. |
Pattern observation: The time grows roughly with n times the cost of heap operations, plus k times removals.
Time Complexity: O(n log n)
This means the time grows roughly like n times the steps needed to keep the heap ordered.
[X] Wrong: "Removing k elements from the heap is the main cost, so time is O(k log n)."
[OK] Correct: Building the heap by adding all n elements also takes time, and since n is usually bigger than k, it dominates the total time.
Understanding how heap operations add up helps you explain your solution clearly and shows you know how data structures affect performance.
"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: Build a max heap from the array
A max heap always keeps the largest element at the root, so building it organizes the data for easy extraction.Step 2: Extract the max element
Each extraction removes the largest element. Afterktimeskextractions, the last extracted element is thekthlargest.Final Answer:
Build max heap and extract maxktimes -> Option CQuick Check:
Max heap extraction = kth largest element [OK]
- Using min heap instead of max heap
- Sorting and picking wrong index
- Confusing kth largest with kth smallest
PriorityQueue?Solution
Step 1: Understand Java PriorityQueue default behavior
By default, PriorityQueue is a min heap, so PriorityQueue<Integer> maxHeap = new PriorityQueue<>(); creates a min heap.Step 2: Use reverse order comparator for max heap
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder()); usesCollections.reverseOrder()which reverses natural order, creating a max heap.Final Answer:
PriorityQueue with reverseOrder comparator -> Option BQuick Check:
Reverse order comparator = max heap [OK]
- Assuming default PriorityQueue is max heap
- Using naturalOrder() which is min heap
- Using nullsFirst() which is unrelated
int[] arr = {4, 10, 3, 5, 1};
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
for (int num : arr) maxHeap.add(num);
int k = 3;
int kthLargest = 0;
for (int i = 0; i < k; i++) {
kthLargest = maxHeap.poll();
}
System.out.println(kthLargest);Solution
Step 1: Build max heap from array
The max heap will organize elements as [10, 5, 4, 3, 1] with 10 at root.Step 2: Extract max element 3 times
First poll: 10, second poll: 5, third poll: 4. The third extracted element is 4.Step 3: Check the printed value
The code prints the last extracted element, which is 4.Final Answer:
4 -> Option AQuick Check:
3rd largest element = 4 [OK]
- Confusing kth largest with kth smallest
- Off-by-one error in loop
- Printing before extraction
int[] arr = {7, 2, 9, 4};
PriorityQueue<Integer> maxHeap = new PriorityQueue<>();
for (int num : arr) maxHeap.add(num);
int k = 2;
int kthLargest = 0;
for (int i = 0; i < k; i++) {
kthLargest = maxHeap.poll();
}
System.out.println(kthLargest);Solution
Step 1: Check PriorityQueue initialization
The code uses default PriorityQueue which is a min heap, not max heap.Step 2: Correct max heap creation
To find kth largest using max heap, PriorityQueue must be created withCollections.reverseOrder().Final Answer:
PriorityQueue should use Collections.reverseOrder() to create max heap -> Option DQuick Check:
Default PriorityQueue = min heap, need reverseOrder for max heap [OK]
- Not using reverseOrder comparator
- Changing loop count incorrectly
- Sorting array unnecessarily
arr = {12, 3, 5, 7, 19} and k = 4, which of the following code snippets correctly finds the 4th largest element using a max heap in Java?Solution
Step 1: Check each option's approach
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(); for (int num : arr) maxHeap.add(num); int kthLargest = 0; for (int i = 0; i < k; i++) kthLargest = maxHeap.poll(); System.out.println(kthLargest); uses default min heap, wrong for max heap extraction. PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder()); for (int num : arr) maxHeap.add(num); int kthLargest = 0; for (int i = 0; i < k; i++) kthLargest = maxHeap.poll(); System.out.println(kthLargest); correctly uses max heap with reverseOrder. PriorityQueue<Integer> minHeap = new PriorityQueue<>(); for (int num : arr) { minHeap.add(num); if (minHeap.size() > k) minHeap.poll(); } System.out.println(minHeap.peek()); uses min heap to keep k largest elements, which finds kth largest but differently. Arrays.sort(arr); System.out.println(arr[k]); prints wrong index after sorting.Step 2: Verify correct kth largest extraction
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder()); for (int num : arr) maxHeap.add(num); int kthLargest = 0; for (int i = 0; i < k; i++) kthLargest = maxHeap.poll(); System.out.println(kthLargest); extracts max element k times from max heap, giving correct 4th largest element.Final Answer:
Use max heap with reverseOrder and extract k times -> Option AQuick Check:
Max heap extraction k times = kth largest [OK]
- Using min heap without size control
- Incorrect array index after sorting
- Confusing min heap approach with max heap
Ready to prove it?
Pass the test and this pattern moves unknown
