DEV Community

M.T.Ramkrushna
M.T.Ramkrushna

Posted on

Topic 11: Heaps & Priority Queues πŸ”οΈ

Heaps are extremely common in coding interviews because they let you efficiently handle problems involving:

  • Minimum / maximum values
  • Top K elements
  • Kth largest / smallest
  • Scheduling
  • Merging sorted data
  • Priority queues

In Python, the main tool is heapq.


1. What is a Heap?

A heap is a special complete binary tree.

There are two common types:

Min Heap

The smallest element is always at the root.

        1
       / \
      3   2
     / \
    7   5
Enter fullscreen mode Exit fullscreen mode

Max Heap

The largest element is always at the root.

Python's heapq directly provides a min heap, not a max heap.


2. Python heapq

import heapq
Enter fullscreen mode Exit fullscreen mode

Create a heap:

heap = []
Enter fullscreen mode Exit fullscreen mode

Add elements:

heapq.heappush(heap, 5)
heapq.heappush(heap, 2)
heapq.heappush(heap, 8)
heapq.heappush(heap, 1)
Enter fullscreen mode Exit fullscreen mode

Now:

print(heap)
Enter fullscreen mode Exit fullscreen mode

The smallest element is at:

heap[0]
Enter fullscreen mode Exit fullscreen mode

Remove the smallest:

x = heapq.heappop(heap)
Enter fullscreen mode Exit fullscreen mode

3. Basic Heap Operations

Operation Complexity
Get minimum O(1)
Insert O(log n)
Remove minimum O(log n)
Build heap O(n)

Example:

import heapq

heap = []

heapq.heappush(heap, 5)
heapq.heappush(heap, 2)
heapq.heappush(heap, 8)
heapq.heappush(heap, 1)

print(heap[0])          # 1
print(heapq.heappop(heap))  # 1
print(heapq.heappop(heap))  # 2
Enter fullscreen mode Exit fullscreen mode

4. Build a Heap from an Array

You can convert a list into a heap:

import heapq

nums = [5, 2, 8, 1, 3]

heapq.heapify(nums)

print(nums)
Enter fullscreen mode Exit fullscreen mode

heapify() takes:

O(n)
Enter fullscreen mode Exit fullscreen mode

This is an important interview fact.


5. Heap Is NOT a Sorted Array

This is a common beginner mistake.

After:

heapq.heapify(nums)
Enter fullscreen mode Exit fullscreen mode

you cannot assume:

nums[0] <= nums[1] <= nums[2] ...
Enter fullscreen mode Exit fullscreen mode

Only this is guaranteed:

nums[0] = smallest element
Enter fullscreen mode Exit fullscreen mode

The remaining elements satisfy the heap property, not complete sorted order.


6. Max Heap in Python

Python doesn't have a direct max heap in heapq.

The standard trick is to use negative values.

import heapq

heap = []

heapq.heappush(heap, -10)
heapq.heappush(heap, -5)
heapq.heappush(heap, -20)

largest = -heapq.heappop(heap)

print(largest)
Enter fullscreen mode Exit fullscreen mode

Output:

20
Enter fullscreen mode Exit fullscreen mode

Why?

Python sees:

-20 < -10 < -5
Enter fullscreen mode Exit fullscreen mode

So the smallest negative value corresponds to the largest original value.


7. Kth Largest Element

This is one of the most important heap interview problems.

Suppose:

nums = [3, 2, 1, 5, 6, 4]
k = 2
Enter fullscreen mode Exit fullscreen mode

Answer:

5
Enter fullscreen mode Exit fullscreen mode

because the sorted array is:

[1, 2, 3, 4, 5, 6]
             ↑
Enter fullscreen mode Exit fullscreen mode

Efficient solution

Maintain a min heap of size k.

import heapq

def kth_largest(nums, k):
    heap = []

    for num in nums:
        heapq.heappush(heap, num)

        if len(heap) > k:
            heapq.heappop(heap)

    return heap[0]
Enter fullscreen mode Exit fullscreen mode

Why does this work?

For:

k = 2
Enter fullscreen mode Exit fullscreen mode

we keep only the two largest values seen so far.

At the end:

heap = [5, 6]
Enter fullscreen mode Exit fullscreen mode

The smallest among these is:

5
Enter fullscreen mode Exit fullscreen mode

which is the 2nd largest overall.

Complexity

Time:  O(n log k)
Space: O(k)
Enter fullscreen mode Exit fullscreen mode

This is much better than sorting when k is small.


8. Top K Largest Elements

Suppose:

nums = [5, 1, 9, 3, 7, 2]
k = 3
Enter fullscreen mode Exit fullscreen mode

We want:

[9, 7, 5]
Enter fullscreen mode Exit fullscreen mode

Use a min heap of size k.

import heapq

def top_k_largest(nums, k):
    heap = []

    for num in nums:
        heapq.heappush(heap, num)

        if len(heap) > k:
            heapq.heappop(heap)

    return heap
Enter fullscreen mode Exit fullscreen mode

The returned heap isn't necessarily sorted.

If sorted output is required:

return sorted(heap, reverse=True)
Enter fullscreen mode Exit fullscreen mode

9. Kth Smallest Element

For the kth smallest, use a max heap of size k.

Since Python only has a min heap, store negatives.

import heapq

def kth_smallest(nums, k):
    heap = []

    for num in nums:
        heapq.heappush(heap, -num)

        if len(heap) > k:
            heapq.heappop(heap)

    return -heap[0]
Enter fullscreen mode Exit fullscreen mode

Example:

nums = [7, 10, 4, 3, 20, 15]
k = 3
Enter fullscreen mode Exit fullscreen mode

Sorted:

[3, 4, 7, 10, 15, 20]
Enter fullscreen mode Exit fullscreen mode

Answer:

7
Enter fullscreen mode Exit fullscreen mode

10. Priority Queue

A priority queue removes the item with the highest priority rather than simply the oldest item.

Python can implement this using a heap.

Example:

import heapq

tasks = []

heapq.heappush(tasks, (2, "Study"))
heapq.heappush(tasks, (1, "Interview"))
heapq.heappush(tasks, (3, "Exercise"))

priority, task = heapq.heappop(tasks)

print(task)
Enter fullscreen mode Exit fullscreen mode

Output:

Interview
Enter fullscreen mode Exit fullscreen mode

Because priority 1 comes first.


11. Heap with Tuples

Python compares tuples lexicographically.

heapq.heappush(heap, (priority, task))
Enter fullscreen mode Exit fullscreen mode

It first compares:

priority
Enter fullscreen mode Exit fullscreen mode

If priorities are equal, it compares:

task
Enter fullscreen mode Exit fullscreen mode

Example:

heap = []

heapq.heappush(heap, (2, "C"))
heapq.heappush(heap, (1, "A"))
heapq.heappush(heap, (2, "B"))

print(heapq.heappop(heap))
Enter fullscreen mode Exit fullscreen mode

Result:

(1, "A")
Enter fullscreen mode Exit fullscreen mode

12. Custom Priority

Suppose you have:

students = [
    ("Alice", 90),
    ("Bob", 95),
    ("Charlie", 85)
]
Enter fullscreen mode Exit fullscreen mode

If you want the highest score first, push negative scores:

import heapq

heap = []

for name, score in students:
    heapq.heappush(heap, (-score, name))

score, name = heapq.heappop(heap)

print(name, -score)
Enter fullscreen mode Exit fullscreen mode

Output:

Bob 95
Enter fullscreen mode Exit fullscreen mode

13. Merge K Sorted Lists

Very common interview problem.

Suppose:

List 1: 1 β†’ 4 β†’ 7
List 2: 2 β†’ 5 β†’ 8
List 3: 3 β†’ 6 β†’ 9
Enter fullscreen mode Exit fullscreen mode

We want:

1 β†’ 2 β†’ 3 β†’ 4 β†’ 5 β†’ 6 β†’ 7 β†’ 8 β†’ 9
Enter fullscreen mode Exit fullscreen mode

The heap stores the smallest current element from each list.

Conceptually:

heap
 ↓
1  2  3
Enter fullscreen mode Exit fullscreen mode

Take 1, then add the next element from its list (4).

Now:

2  3  4
Enter fullscreen mode Exit fullscreen mode

Continue.

Generic implementation

For arrays:

import heapq

def merge_k_sorted_lists(lists):
    heap = []

    for i, arr in enumerate(lists):
        if arr:
            heapq.heappush(heap, (arr[0], i, 0))

    result = []

    while heap:
        value, list_index, element_index = heapq.heappop(heap)
        result.append(value)

        next_index = element_index + 1

        if next_index < len(lists[list_index]):
            next_value = lists[list_index][next_index]

            heapq.heappush(
                heap,
                (next_value, list_index, next_index)
            )

    return result
Enter fullscreen mode Exit fullscreen mode

Complexity

If there are N total elements and K lists:

Time:  O(N log K)
Space: O(K)
Enter fullscreen mode Exit fullscreen mode

14. K Closest Points to Origin

Another famous heap problem.

Point:

(x, y)
Enter fullscreen mode Exit fullscreen mode

Distance from origin:

xΒ² + yΒ²
Enter fullscreen mode Exit fullscreen mode

We don't need the square root because comparing squared distances gives the same ordering.

Example:

points = [
    [1, 3],
    [-2, 2],
    [5, 8],
    [0, 1]
]
Enter fullscreen mode Exit fullscreen mode

We want the k closest points.

A simple min-heap solution:

import heapq

def k_closest(points, k):
    heap = []

    for x, y in points:
        distance = x * x + y * y
        heapq.heappush(heap, (distance, x, y))

    result = []

    for _ in range(k):
        _, x, y = heapq.heappop(heap)
        result.append([x, y])

    return result
Enter fullscreen mode Exit fullscreen mode

Complexity:

O(n log n)
Enter fullscreen mode Exit fullscreen mode

There is also an O(n log k) max-heap approach, which is preferable when k is much smaller than n.


15. Find Median from Data Stream

This is a classic two heaps problem.

Maintain:

Max heap β†’ smaller half
Min heap β†’ larger half
Enter fullscreen mode Exit fullscreen mode

Example:

Numbers:
1, 2, 3, 4
Enter fullscreen mode Exit fullscreen mode

Conceptually:

max heap       min heap
[1, 2]   |   [3, 4]
Enter fullscreen mode Exit fullscreen mode

Median:

(2 + 3) / 2 = 2.5
Enter fullscreen mode Exit fullscreen mode

For:

1, 2, 3
Enter fullscreen mode Exit fullscreen mode

we might have:

max heap       min heap
[1, 2]   |   [3]
Enter fullscreen mode Exit fullscreen mode

Median:

2
Enter fullscreen mode Exit fullscreen mode

This problem teaches an important pattern:

Use two heaps when you need to continuously maintain the middle of a changing dataset.


16. Heap vs Sorting

Suppose you need the largest k elements.

Sorting

nums.sort(reverse=True)
answer = nums[:k]
Enter fullscreen mode Exit fullscreen mode

Complexity:

O(n log n)
Enter fullscreen mode Exit fullscreen mode

Heap

O(n log k)
Enter fullscreen mode Exit fullscreen mode

So if:

n = 1,000,000
k = 10
Enter fullscreen mode Exit fullscreen mode

a heap can be much more appropriate.


17. When Should You Think "Heap"?

Look for phrases such as:

"K largest"

β†’ min heap of size K
Enter fullscreen mode Exit fullscreen mode

"K smallest"

β†’ max heap of size K
Enter fullscreen mode Exit fullscreen mode

"Repeatedly get minimum"

β†’ min heap
Enter fullscreen mode Exit fullscreen mode

"Repeatedly get maximum"

β†’ max heap
Enter fullscreen mode Exit fullscreen mode

"Priority"

β†’ priority queue / heap
Enter fullscreen mode Exit fullscreen mode

"Merge K sorted"

β†’ min heap
Enter fullscreen mode Exit fullscreen mode

"Median of a stream"

β†’ two heaps
Enter fullscreen mode Exit fullscreen mode

"Next task with smallest cost/time"

β†’ priority queue
Enter fullscreen mode Exit fullscreen mode

18. Important Heap Pattern

Memorize this:

Top K largest

heap = []

for x in nums:
    heapq.heappush(heap, x)

    if len(heap) > k:
        heapq.heappop(heap)
Enter fullscreen mode Exit fullscreen mode

At the end:

heap[0]
Enter fullscreen mode Exit fullscreen mode

is the kth largest.


Top K smallest

Use negative values:

heap = []

for x in nums:
    heapq.heappush(heap, -x)

    if len(heap) > k:
        heapq.heappop(heap)
Enter fullscreen mode Exit fullscreen mode

Then:

-heap[0]
Enter fullscreen mode Exit fullscreen mode

is the kth smallest.


19. Heap vs Stack vs Queue

Structure Main behavior Typical use
Stack LIFO DFS, parentheses
Queue FIFO BFS
Heap Highest/lowest priority Scheduling, Top K
Hash Map Key β†’ value Fast lookup
Set Unique values Membership

This distinction is very important in interviews.


20. Common Mistakes

Mistake 1: Assuming heap is sorted

Wrong:

heapq.heapify(nums)
print(nums)
Enter fullscreen mode Exit fullscreen mode

doesn't give a sorted list.

Mistake 2: Forgetting Python has a min heap

For a max heap, use:

-x
Enter fullscreen mode Exit fullscreen mode

Mistake 3: Using a heap when sorting is simpler

If you need all elements sorted, simply sorting may be clearer.

Use heaps when you need to repeatedly access an extreme element or only need a subset such as Top K.

Mistake 4: Forgetting tuple tie-breaking

With:

heapq.heappush(heap, (priority, value))
Enter fullscreen mode Exit fullscreen mode

Python compares priority first, then value if priorities are equal.


Interview Cheat Sheet 🧠

Minimum repeatedly
        ↓
    Min Heap

Maximum repeatedly
        ↓
    Max Heap

K largest
        ↓
Min Heap of size K

K smallest
        ↓
Max Heap of size K

Merge K sorted
        ↓
Min Heap

Median stream
        ↓
Two Heaps

Priority scheduling
        ↓
Priority Queue
Enter fullscreen mode Exit fullscreen mode

Practice Questions

Easy

  1. Implement a min heap using heapq
  2. Kth Largest Element
  3. Kth Smallest Element
  4. Last Stone Weight
  5. Top K Frequent Elements

Medium

  1. K Closest Points to Origin
  2. Merge K Sorted Lists
  3. Task Scheduler
  4. Find Median from Data Stream
  5. Kth Largest Element in a Stream
  6. Smallest Number in Infinite Set
  7. Reorganize String

⭐ Must-do interview problems

If you're preparing specifically for coding interviews, make sure you can solve:

1. Kth Largest Element
2. Top K Frequent Elements
3. K Closest Points
4. Merge K Sorted Lists
5. Find Median from Data Stream
Enter fullscreen mode Exit fullscreen mode

Next topic: Graphs β€” adjacency lists/matrices, DFS, BFS, connected components, cycle detection, and shortest paths.

Top comments (0)