Hardheap

Решить задачу Find Median from Data Stream (LeetCode 295)?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

LeetCode 295. Поток чисел, поддерживать median за O(log n) per add. Два heap-а: max-heap для lower half, min-heap для upper half.

import heapq

class MedianFinder:
    def __init__(self):
        self.lo = []   # max-heap (через negative)
        self.hi = []   # min-heap

    def addNum(self, num):
        heapq.heappush(self.lo, -num)
        heapq.heappush(self.hi, -heapq.heappop(self.lo))
        if len(self.lo) < len(self.hi):
            heapq.heappush(self.lo, -heapq.heappop(self.hi))

    def findMedian(self):
        if len(self.lo) > len(self.hi):
            return -self.lo[0]
        return (-self.lo[0] + self.hi[0]) / 2

Инвариант: lo хранит lower half, hi — upper half; lo может быть на 1 больше. addNum: push в lo → pop из lo в hi (балансировка), при необходимости вернуть один в lo. Median: нечётное — top of lo; чётное — average двух tops. Brute force — sorted insertion O(n). Связанные: Sliding Window Median (480) — нужно remove из heap (lazy deletion).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.