-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathFinding MK Average.py
60 lines (47 loc) · 1.45 KB
/
Finding MK Average.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
48
49
50
51
52
53
54
55
56
57
58
59
60
from sortedcontainers import SortedList
class MKAverage:
MAX_NUM = 10 ** 5
def __init__(self, m: int, k: int):
self.m = m
self.k = k
# sorted list
self.sl = SortedList([0] * m)
# sum of k smallest elements
self.sum_k = 0
# sum of m - k smallest elements
self.sum_m_k = 0
# queue for the last M elements if the stream
self.q = deque([0] * m)
def addElement(self, num: int) -> None:
# Time: O(logm)
m, k, q, sl = self.m, self.k, self.q, self.sl
# update q
q.append(num)
old = q.popleft()
# remove the old num
r = sl.bisect_right(old)
# maintain sum_k
if r <= k:
self.sum_k -= old
self.sum_k += sl[k]
# maintain sum_m_k
if r <= m - k:
self.sum_m_k -= old
self.sum_m_k += sl[m-k]
# remove the old num
sl.remove(old)
# add the new num
r = sl.bisect_right(num)
if r < k:
self.sum_k -= sl[k-1]
self.sum_k += num
if r < m - k:
self.sum_m_k -= sl[m - k - 1]
self.sum_m_k += num
sl.add(num)
return
def calculateMKAverage(self) -> int:
# Time: O(1)
if self.sl[0] == 0:
return -1
return (self.sum_m_k - self.sum_k) // (self.m - self.k * 2)