Always get the min (or max) in O(log n). Python's heapq is a min-heap. Negate values for max-heap.
[]| Operation | Sorted Array | Heap |
|---|---|---|
| Build from n elements | O(n log n) | O(n) |
| Get min | O(1) | O(1) |
| Remove min | O(n) | O(log n) |
| Insert | O(n) | O(log n) |
import heapq # Max-heap trick: negate values max_heap = [] heapq.heappush(max_heap, -5) # push 5 heapq.heappush(max_heap, -3) # push 3 -heapq.heappop(max_heap) # returns 5 (max) # Heap of tuples: (priority, value) heapq.heappush(h, (2, 'task')) # sorted by first element
import heapq from collections import Counter # K Largest Elements — min-heap of size k def k_largest(nums, k): return heapq.nlargest(k, nums) # O(n log k) # Manual: maintain min-heap of size k def k_largest_manual(nums, k): heap = nums[:k] heapq.heapify(heap) # O(k) for n in nums[k:]: if n > heap[0]: heapq.heapreplace(heap, n) # O(log k) return heap # Top K Frequent Elements def top_k_frequent(nums, k): count = Counter(nums) return heapq.nlargest(k, count, key=count.get) # Kth Largest — use min-heap size k def kth_largest(nums, k): heap = heapq.nsmallest(k, nums) # heap[0] = kth largest return heap[0]