Skip to content

Commit a2ee7be

Browse files
committed
feat: add solutions to lc problem: No.1825
No.1825.Finding MK Average
1 parent 1adad2c commit a2ee7be

File tree

2 files changed

+99
-3
lines changed

2 files changed

+99
-3
lines changed

solution/1800-1899/1825.Finding MK Average/README.md

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ obj.calculateMKAverage(); // 最后 3 个元素为 [5,5,5]
6969

7070
**方法一:有序集合 + 队列**
7171

72-
在本题中,我们需要维护的数据结构或变量有
72+
我们可以维护以下数据结构或变量
7373

74-
- 一个长度为 $m$ 的队列 $q$,其中队首元素为最早加入的元素,队尾元素为最近加入的元素
74+
- 一个长度为 $m$ 的队列 $q$,其中队首元素为最早加入的元素,队尾元素为最近加入的元素
7575
- 三个有序集合,分别为 $lo$, $mid$, $hi$,其中 $lo$ 和 $hi$ 分别存储最小的 $k$ 个元素和最大的 $k$ 个元素,而 $mid$ 存储剩余的元素;
76-
- 一个变量 $s$,维护 $mid$ 中所有元素的和
76+
- 一个变量 $s$,维护 $mid$ 中所有元素的和
7777
- 部分编程语言(如 Java, Go)额外维护两个变量 $size1$ 和 $size3$,分别表示 $lo$ 和 $hi$ 中元素的个数。
7878

7979
调用 $addElement(num)$ 函数时,顺序执行以下操作:
@@ -149,6 +149,54 @@ class MKAverage:
149149
return -1 if len(self.q) < self.m else self.s // (self.m - 2 * self.k)
150150

151151

152+
# Your MKAverage object will be instantiated and called as such:
153+
# obj = MKAverage(m, k)
154+
# obj.addElement(num)
155+
# param_2 = obj.calculateMKAverage()
156+
```
157+
158+
```python
159+
from sortedcontainers import SortedList
160+
161+
162+
class MKAverage:
163+
164+
def __init__(self, m: int, k: int):
165+
self.m = m
166+
self.k = k
167+
self.sl = SortedList()
168+
self.q = deque()
169+
self.s = 0
170+
171+
def addElement(self, num: int) -> None:
172+
self.q.append(num)
173+
if len(self.q) == self.m:
174+
self.sl = SortedList(self.q)
175+
self.s = sum(self.sl[self.k: -self.k])
176+
elif len(self.q) > self.m:
177+
i = self.sl.bisect_left(num)
178+
if i < self.k:
179+
self.s += self.sl[self.k - 1]
180+
elif self.k <= i <= self.m - self.k:
181+
self.s += num
182+
else:
183+
self.s += self.sl[self.m - self.k]
184+
self.sl.add(num)
185+
186+
x = self.q.popleft()
187+
i = self.sl.bisect_left(x)
188+
if i < self.k:
189+
self.s -= self.sl[self.k]
190+
elif self.k <= i <= self.m - self.k:
191+
self.s -= x
192+
else:
193+
self.s -= self.sl[self.m - self.k]
194+
self.sl.remove(x)
195+
196+
def calculateMKAverage(self) -> int:
197+
return -1 if len(self.sl) < self.m else self.s // (self.m - self.k * 2)
198+
199+
152200
# Your MKAverage object will be instantiated and called as such:
153201
# obj = MKAverage(m, k)
154202
# obj.addElement(num)

solution/1800-1899/1825.Finding MK Average/README_EN.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,54 @@ class MKAverage:
119119
return -1 if len(self.q) < self.m else self.s // (self.m - 2 * self.k)
120120

121121

122+
# Your MKAverage object will be instantiated and called as such:
123+
# obj = MKAverage(m, k)
124+
# obj.addElement(num)
125+
# param_2 = obj.calculateMKAverage()
126+
```
127+
128+
```python
129+
from sortedcontainers import SortedList
130+
131+
132+
class MKAverage:
133+
134+
def __init__(self, m: int, k: int):
135+
self.m = m
136+
self.k = k
137+
self.sl = SortedList()
138+
self.q = deque()
139+
self.s = 0
140+
141+
def addElement(self, num: int) -> None:
142+
self.q.append(num)
143+
if len(self.q) == self.m:
144+
self.sl = SortedList(self.q)
145+
self.s = sum(self.sl[self.k: -self.k])
146+
elif len(self.q) > self.m:
147+
i = self.sl.bisect_left(num)
148+
if i < self.k:
149+
self.s += self.sl[self.k - 1]
150+
elif self.k <= i <= self.m - self.k:
151+
self.s += num
152+
else:
153+
self.s += self.sl[self.m - self.k]
154+
self.sl.add(num)
155+
156+
x = self.q.popleft()
157+
i = self.sl.bisect_left(x)
158+
if i < self.k:
159+
self.s -= self.sl[self.k]
160+
elif self.k <= i <= self.m - self.k:
161+
self.s -= x
162+
else:
163+
self.s -= self.sl[self.m - self.k]
164+
self.sl.remove(x)
165+
166+
def calculateMKAverage(self) -> int:
167+
return -1 if len(self.sl) < self.m else self.s // (self.m - self.k * 2)
168+
169+
122170
# Your MKAverage object will be instantiated and called as such:
123171
# obj = MKAverage(m, k)
124172
# obj.addElement(num)

0 commit comments

Comments
 (0)