Kth Largest Element in a Stream

easy heap design

Problem

Design a class that tracks the k-th largest element in a stream of integers. Each add(val) returns the k-th largest seen so far.

Inputk = 3, nums = [4, 5, 8, 2]; add(3); add(5); add(10); add(9); add(4)
Output4, 5, 5, 8, 8
Min-heap of size k; root is the k-th largest after every add.

import heapq
class KthLargest:
    def __init__(self, k, nums):
        self.k = k
        self.h = []
        for x in nums: self.add(x)
    def add(self, val):
        if len(self.h) < self.k:
            heapq.heappush(self.h, val)
        elif val > self.h[0]:
            heapq.heapreplace(self.h, val)
        return self.h[0]
// Sketch with sorted array stand-in for a min-heap of size k.
class KthLargest {
  constructor(k, nums) { this.k = k; this.h = []; for (const x of nums) this.add(x); }
  add(val) {
    if (this.h.length < this.k) {
      this.h.push(val); this.h.sort((a, b) => a - b);
    } else if (val > this.h[0]) {
      this.h[0] = val; this.h.sort((a, b) => a - b);
    }
    return this.h[0];
  }
}
class KthLargest {
    int k;
    PriorityQueue<Integer> h = new PriorityQueue<>();
    public KthLargest(int k, int[] nums) { this.k = k; for (int x : nums) add(x); }
    public int add(int val) {
        if (h.size() < k) h.offer(val);
        else if (val > h.peek()) { h.poll(); h.offer(val); }
        return h.peek();
    }
}
class KthLargest {
    int k;
    priority_queue<int, vector<int>, greater<int>> h;
public:
    KthLargest(int k, vector<int>& nums) : k(k) { for (int x : nums) add(x); }
    int add(int val) {
        if ((int)h.size() < k) h.push(val);
        else if (val > h.top()) { h.pop(); h.push(val); }
        return h.top();
    }
};
Time: O(log k) per add Space: O(k)