Heap¶
Table of Contents¶
- 215. Kth Largest Element in an Array (Medium)
- 502. IPO (Hard)
- 373. Find K Pairs with Smallest Sums (Medium)
- 295. Find Median from Data Stream (Hard)
215. Kth Largest Element in an Array¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, divide and conquer, sorting, heap priority queue, quickselect
215. Kth Largest Element in an Array - Python Solution
import heapq
from typing import List
def findKthLargest(nums: List[int], k: int) -> int:
minHeap = []
for i, num in enumerate(nums):
heapq.heappush(minHeap, num)
if i >= k:
heapq.heappop(minHeap)
return minHeap[0]
nums = [3, 2, 1, 5, 6, 4]
k = 2
print(findKthLargest(nums, k)) # 5
502. IPO¶
-
LeetCode | LeetCode CH (Hard)
-
Tags: array, greedy, sorting, heap priority queue
502. IPO - Python Solution
import heapq
from typing import List
# Heap - Two Heaps
def findMaximizedCapital(
k: int, w: int, profits: List[int], capital: List[int]
) -> int:
if not profits or not capital:
return w
minHeap = []
maxHeap = []
for i in range(len(profits)):
heapq.heappush(minHeap, (capital[i], profits[i]))
for _ in range(k):
while minHeap and minHeap[0][0] <= w:
capital, profit = heapq.heappop(minHeap)
heapq.heappush(maxHeap, -profit)
if not maxHeap:
break
w += -heapq.heappop(maxHeap)
return w
k = 2
w = 0
profits = [1, 2, 3]
capital = [0, 1, 1]
print(findMaximizedCapital(k, w, profits, capital)) # 4
373. Find K Pairs with Smallest Sums¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, heap priority queue
373. Find K Pairs with Smallest Sums - Python Solution
import heapq
from typing import List
# Heap - Merge K Sorted
def kSmallestPairs(
nums1: List[int], nums2: List[int], k: int
) -> List[List[int]]:
if not nums1 or not nums2 or k <= 0:
return []
result = []
min_heap = []
for j in range(min(k, len(nums2))):
heapq.heappush(min_heap, (nums1[0] + nums2[j], 0, j))
while k > 0 and min_heap:
_, i, j = heapq.heappop(min_heap)
result.append([nums1[i], nums2[j]])
k -= 1
if i + 1 < len(nums1):
heapq.heappush(min_heap, (nums1[i + 1] + nums2[j], i + 1, j))
return result
nums1 = [1, 2, 4, 5, 6]
nums2 = [3, 5, 7, 9]
k = 3
print(kSmallestPairs(nums1, nums2, k))
# [[1, 3], [2, 3], [1, 5]]
295. Find Median from Data Stream¶
-
LeetCode | LeetCode CH (Hard)
-
Tags: two pointers, design, sorting, heap priority queue, data stream
295. Find Median from Data Stream - Python Solution
from heapq import heappop, heappush
# Dual Heaps
class MedianFinder:
def __init__(self):
self.minHeap = []
self.maxHeap = []
self.min_size = 0
self.max_size = 0
def addNum(self, num: int) -> None:
heappush(self.maxHeap, -num)
heappush(self.minHeap, -heappop(self.maxHeap))
self.min_size += 1
if self.min_size > self.max_size:
heappush(self.maxHeap, -heappop(self.minHeap))
self.min_size -= 1
self.max_size += 1
def findMedian(self) -> float:
if self.min_size == self.max_size:
return (-self.maxHeap[0] + self.minHeap[0]) / 2.0
return -self.maxHeap[0]
obj = MedianFinder()
obj.addNum(1)
obj.addNum(2)
assert obj.findMedian() == 1.5
obj.addNum(3)
assert obj.findMedian() == 2
obj.addNum(4)
assert obj.findMedian() == 2.5
obj.addNum(5)
assert obj.findMedian() == 3
print("All Passed.")
295. Find Median from Data Stream - C++ Solution
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
class MedianFinder {
private:
priority_queue<int> maxHeap;
priority_queue<int, vector<int>, greater<int>> minHeap;
int max_size = 0;
int min_size = 0;
public:
MedianFinder() {}
void addNum(int num) {
if (min_size == max_size) {
minHeap.push(num);
maxHeap.push(minHeap.top());
minHeap.pop();
max_size++;
} else {
maxHeap.push(num);
minHeap.push(maxHeap.top());
maxHeap.pop();
min_size++;
}
}
double findMedian() {
if (min_size == max_size) {
return (maxHeap.top() + minHeap.top()) / 2.0;
} else {
return (double)maxHeap.top();
}
}
};
int main() {
MedianFinder* obj = new MedianFinder();
obj->addNum(1);
obj->addNum(2);
cout << obj->findMedian() << endl; // 1.5
obj->addNum(3);
cout << obj->findMedian() << endl; // 2
return 0;
}