Skip to content

Commit 1394450

Browse files
committed
Time: 2882 ms (85.71%), Space: 44.1 MB (90.48%) - LeetHub
1 parent 7995e09 commit 1394450

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
class Helper:
2+
def __init__(self, x):
3+
self.x = x
4+
self.result = 0
5+
self.large = SortedList()
6+
self.small = SortedList()
7+
self.occ = defaultdict(int)
8+
9+
def insert(self, num):
10+
if self.occ[num] > 0:
11+
self.internal_remove((self.occ[num], num))
12+
self.occ[num] += 1
13+
self.internal_insert((self.occ[num], num))
14+
15+
def remove(self, num):
16+
self.internal_remove((self.occ[num], num))
17+
self.occ[num] -= 1
18+
if self.occ[num] > 0:
19+
self.internal_insert((self.occ[num], num))
20+
21+
def get(self):
22+
return self.result
23+
24+
def internal_insert(self, p):
25+
if len(self.large) < self.x or p > self.large[0]:
26+
self.result += p[0] * p[1]
27+
self.large.add(p)
28+
if len(self.large) > self.x:
29+
to_remove = self.large[0]
30+
self.result -= to_remove[0] * to_remove[1]
31+
self.large.remove(to_remove)
32+
self.small.add(to_remove)
33+
else:
34+
self.small.add(p)
35+
36+
def internal_remove(self, p):
37+
if p >= self.large[0]:
38+
self.result -= p[0] * p[1]
39+
self.large.remove(p)
40+
if self.small:
41+
to_add = self.small[-1]
42+
self.result += to_add[0] * to_add[1]
43+
self.small.remove(to_add)
44+
self.large.add(to_add)
45+
else:
46+
self.small.remove(p)
47+
48+
49+
class Solution:
50+
def findXSum(self, nums, k, x):
51+
helper = Helper(x)
52+
ans = []
53+
54+
for i in range(len(nums)):
55+
helper.insert(nums[i])
56+
if i >= k:
57+
helper.remove(nums[i - k])
58+
if i >= k - 1:
59+
ans.append(helper.get())
60+
61+
return ans

0 commit comments

Comments
 (0)