generated from zeikar/issueage
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfind-median-from-data-stream.py
47 lines (37 loc) · 1.53 KB
/
find-median-from-data-stream.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from queue import PriorityQueue
class MedianFinder:
def __init__(self):
self.leftPriorityQueue = PriorityQueue()
self.rightPriorityQueue = PriorityQueue()
self.leftPriorityQueue.put(1000000)
self.rightPriorityQueue.put(1000000)
def addNum(self, num: int) -> None:
left = -self.leftPriorityQueue.get()
right = self.rightPriorityQueue.get()
self.leftPriorityQueue.put(-left)
self.rightPriorityQueue.put(right)
if num < left:
self.leftPriorityQueue.put(-num)
else:
self.rightPriorityQueue.put(num)
if self.leftPriorityQueue.qsize() > self.rightPriorityQueue.qsize() + 1:
val = -self.leftPriorityQueue.get()
self.rightPriorityQueue.put(val)
elif self.leftPriorityQueue.qsize() < self.rightPriorityQueue.qsize():
val = self.rightPriorityQueue.get()
self.leftPriorityQueue.put(-val)
def findMedian(self) -> float:
left = -self.leftPriorityQueue.get()
right = self.rightPriorityQueue.get()
self.leftPriorityQueue.put(-left)
self.rightPriorityQueue.put(right)
if self.leftPriorityQueue.qsize() == self.rightPriorityQueue.qsize():
return (left + right) / 2
elif self.leftPriorityQueue.qsize() > self.rightPriorityQueue.qsize():
return left
else:
return right
# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()