File tree Expand file tree Collapse file tree 1 file changed +63
-0
lines changed Expand file tree Collapse file tree 1 file changed +63
-0
lines changed Original file line number Diff line number Diff line change
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 )
You can’t perform that action at this time.
0 commit comments