DEV Community

tracelit
tracelit

Posted on • Originally published at tracelit.dev

LeetCode 295: Find Median From Data Stream — Step-by-Step Visual Trace

Hard — Heap | Data Stream | Two Heaps | Design

The Problem

Design a data structure that supports adding integers from a data stream and finding the median of all elements added so far in constant time.

Approach

Use two heaps to maintain balance: a max heap for smaller half of elements and min heap for larger half. Keep heaps balanced so median is either the top of max heap or average of both tops.

Time: O(log n) for addNum, O(1) for findMedian · Space: O(n)

Code

import heapq

class MedianFinder:
    def __init__(self):
        self.min_heap = []  # To store larger elements
        self.max_heap = []  # To store smaller elements

    def addNum(self, num: int) -> None:
        if not self.max_heap or num <= -self.max_heap[0]:
            heapq.heappush(self.max_heap, -num)
        else:
            heapq.heappush(self.min_heap, num)

        # Balance the heaps
        if len(self.max_heap) > len(self.min_heap) + 1:
            heapq.heappush(self.min_heap, -heapq.heappop(self.max_heap))
        elif len(self.min_heap) > len(self.max_heap):
            heapq.heappush(self.max_heap, -heapq.heappop(self.min_heap))

    def findMedian(self) -> float:
        if len(self.max_heap) == len(self.min_heap):
            return (-self.max_heap[0] + self.min_heap[0]) / 2
        else:
            return -self.max_heap[0]
Enter fullscreen mode Exit fullscreen mode

Watch It Run

Watch the algorithm run step by step

Watch the algorithm run step by step

Open interactive visualization

Try it yourself: Open TraceLit and step through every line.


Built with TraceLit — the visual algorithm tracer for LeetCode practice.

Top comments (0)