Skip to content

Commit 5947f11

Browse files
authored
Create finding-mk-average.py
1 parent a0c9a7c commit 5947f11

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

Python/finding-mk-average.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Time: ctor: O(1)
2+
# add_element: O(logn)
3+
# calc_mkaverage: O(1)
4+
# Space: O(m)
5+
6+
import collections
7+
from sortedcontainers import SortedList
8+
9+
10+
class MKAverage(object):
11+
12+
def __init__(self, m, k):
13+
"""
14+
:type m: int
15+
:type k: int
16+
"""
17+
self.__m = m
18+
self.__k = k
19+
self.__dq = collections.deque()
20+
self.__sl = SortedList()
21+
self.__total = self.__first_k = self.__last_k = 0
22+
23+
def addElement(self, num):
24+
"""
25+
:type num: int
26+
:rtype: None
27+
"""
28+
if len(self.__dq) == self.__m:
29+
self.__remove(self.__dq.popleft())
30+
self.__dq.append(num)
31+
self.__add(num)
32+
33+
def calculateMKAverage(self):
34+
"""
35+
:rtype: int
36+
"""
37+
if len(self.__sl) < self.__m:
38+
return -1
39+
return (self.__total-self.__first_k-self.__last_k)//(self.__m-2*self.__k)
40+
41+
def __add(self, num):
42+
self.__total += num
43+
idx = self.__sl.bisect_left(num)
44+
if idx < self.__k:
45+
self.__first_k += num
46+
if len(self.__sl) >= self.__k:
47+
self.__first_k -= self.__sl[self.__k-1]
48+
if idx > len(self.__sl)-self.__k:
49+
self.__last_k += num
50+
if len(self.__sl) >= self.__k:
51+
self.__last_k -= self.__sl[-self.__k]
52+
self.__sl.add(num)
53+
54+
def __remove(self, num):
55+
self.__total -= num
56+
idx = self.__sl.bisect_left(num)
57+
if idx < self.__k:
58+
self.__first_k -= num
59+
self.__first_k += self.__sl[self.__k]
60+
elif idx > len(self.__sl)-1 - self.__k:
61+
self.__last_k -= num
62+
self.__last_k += self.__sl[-1-self.__k]
63+
self.__sl.remove(num)

0 commit comments

Comments
 (0)