diff --git a/solution/3300-3399/3369.Design an Array Statistics Tracker/README.md b/solution/3300-3399/3369.Design an Array Statistics Tracker/README.md index 29768518fad33..600d9f2fd9b7b 100644 --- a/solution/3300-3399/3369.Design an Array Statistics Tracker/README.md +++ b/solution/3300-3399/3369.Design an Array Statistics Tracker/README.md @@ -109,7 +109,51 @@ statisticsTracker.getMode(); // return 5 #### Python3 ```python - +from sortedcontainers import SortedList + + +class StatisticsTracker: + + def __init__(self): + self.q = deque() + self.s = 0 + self.cnt = defaultdict(int) + self.sl = SortedList() + self.sl2 = SortedList(key=lambda x: (-x[1], x[0])) + + def addNumber(self, number: int) -> None: + self.q.append(number) + self.sl.add(number) + self.sl2.discard((number, self.cnt[number])) + self.cnt[number] += 1 + self.sl2.add((number, self.cnt[number])) + self.s += number + + def removeFirstAddedNumber(self) -> None: + number = self.q.popleft() + self.sl.remove(number) + self.sl2.discard((number, self.cnt[number])) + self.cnt[number] -= 1 + self.sl2.add((number, self.cnt[number])) + self.s -= number + + def getMean(self) -> int: + return self.s // len(self.q) + + def getMedian(self) -> int: + return self.sl[len(self.q) // 2] + + def getMode(self) -> int: + return self.sl2[0][0] + + +# Your StatisticsTracker object will be instantiated and called as such: +# obj = StatisticsTracker() +# obj.addNumber(number) +# obj.removeFirstAddedNumber() +# param_3 = obj.getMean() +# param_4 = obj.getMedian() +# param_5 = obj.getMode() ``` #### Java diff --git a/solution/3300-3399/3369.Design an Array Statistics Tracker/README_EN.md b/solution/3300-3399/3369.Design an Array Statistics Tracker/README_EN.md index 9e93150d6c3c0..1ac13e751cb9b 100644 --- a/solution/3300-3399/3369.Design an Array Statistics Tracker/README_EN.md +++ b/solution/3300-3399/3369.Design an Array Statistics Tracker/README_EN.md @@ -107,7 +107,51 @@ statisticsTracker.getMode(); // return 5 #### Python3 ```python - +from sortedcontainers import SortedList + + +class StatisticsTracker: + + def __init__(self): + self.q = deque() + self.s = 0 + self.cnt = defaultdict(int) + self.sl = SortedList() + self.sl2 = SortedList(key=lambda x: (-x[1], x[0])) + + def addNumber(self, number: int) -> None: + self.q.append(number) + self.sl.add(number) + self.sl2.discard((number, self.cnt[number])) + self.cnt[number] += 1 + self.sl2.add((number, self.cnt[number])) + self.s += number + + def removeFirstAddedNumber(self) -> None: + number = self.q.popleft() + self.sl.remove(number) + self.sl2.discard((number, self.cnt[number])) + self.cnt[number] -= 1 + self.sl2.add((number, self.cnt[number])) + self.s -= number + + def getMean(self) -> int: + return self.s // len(self.q) + + def getMedian(self) -> int: + return self.sl[len(self.q) // 2] + + def getMode(self) -> int: + return self.sl2[0][0] + + +# Your StatisticsTracker object will be instantiated and called as such: +# obj = StatisticsTracker() +# obj.addNumber(number) +# obj.removeFirstAddedNumber() +# param_3 = obj.getMean() +# param_4 = obj.getMedian() +# param_5 = obj.getMode() ``` #### Java diff --git a/solution/3300-3399/3369.Design an Array Statistics Tracker/Solution.py b/solution/3300-3399/3369.Design an Array Statistics Tracker/Solution.py new file mode 100644 index 0000000000000..dfff4f63287c1 --- /dev/null +++ b/solution/3300-3399/3369.Design an Array Statistics Tracker/Solution.py @@ -0,0 +1,44 @@ +from sortedcontainers import SortedList + + +class StatisticsTracker: + def __init__(self): + self.q = deque() + self.s = 0 + self.cnt = defaultdict(int) + self.sl = SortedList() + self.sl2 = SortedList(key=lambda x: (-x[1], x[0])) + + def addNumber(self, number: int) -> None: + self.q.append(number) + self.sl.add(number) + self.sl2.discard((number, self.cnt[number])) + self.cnt[number] += 1 + self.sl2.add((number, self.cnt[number])) + self.s += number + + def removeFirstAddedNumber(self) -> None: + number = self.q.popleft() + self.sl.remove(number) + self.sl2.discard((number, self.cnt[number])) + self.cnt[number] -= 1 + self.sl2.add((number, self.cnt[number])) + self.s -= number + + def getMean(self) -> int: + return self.s // len(self.q) + + def getMedian(self) -> int: + return self.sl[len(self.q) // 2] + + def getMode(self) -> int: + return self.sl2[0][0] + + +# Your StatisticsTracker object will be instantiated and called as such: +# obj = StatisticsTracker() +# obj.addNumber(number) +# obj.removeFirstAddedNumber() +# param_3 = obj.getMean() +# param_4 = obj.getMedian() +# param_5 = obj.getMode()