From 84d61429569b21c320e568f24dde1d6986990e3c Mon Sep 17 00:00:00 2001 From: shining-ai Date: Mon, 10 Jun 2024 14:29:37 +0000 Subject: [PATCH] =?UTF-8?q?=E3=80=90Grind75Hard=E3=80=9111=E5=95=8F?= =?UTF-8?q?=E7=9B=AE=20895.=20Maximum=20Frequency=20Stack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../level_1.py | 21 +++++++++++++++++++ .../level_2.py | 21 +++++++++++++++++++ .../level_3.py | 18 ++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 grind75_hard/11_895. Maximum Frequency Stack/level_1.py create mode 100644 grind75_hard/11_895. Maximum Frequency Stack/level_2.py create mode 100644 grind75_hard/11_895. Maximum Frequency Stack/level_3.py diff --git a/grind75_hard/11_895. Maximum Frequency Stack/level_1.py b/grind75_hard/11_895. Maximum Frequency Stack/level_1.py new file mode 100644 index 0000000..94aacfd --- /dev/null +++ b/grind75_hard/11_895. Maximum Frequency Stack/level_1.py @@ -0,0 +1,21 @@ +# 回数ごとに違うstackを作る +class FreqStack: + + def __init__(self): + self.freq = defaultdict(int) + self.stack = [[]] + self.max_freq = 0 + + def push(self, val: int) -> None: + self.freq[val] += 1 + if len(self.stack) < self.freq[val]: + self.stack.append([]) + self.max_freq = max(self.max_freq, self.freq[val]) + self.stack[self.freq[val] - 1].append(val) + + def pop(self) -> int: + val = self.stack[self.max_freq - 1].pop() + self.freq[val] -= 1 + if not self.stack[self.max_freq - 1]: + self.max_freq -= 1 + return val diff --git a/grind75_hard/11_895. Maximum Frequency Stack/level_2.py b/grind75_hard/11_895. Maximum Frequency Stack/level_2.py new file mode 100644 index 0000000..ac50d5a --- /dev/null +++ b/grind75_hard/11_895. Maximum Frequency Stack/level_2.py @@ -0,0 +1,21 @@ +# stacksをdefaultdict(list)を使うことで空の場合の確認を不要にした。 +class FreqStack: + + def __init__(self): + self.frequency = defaultdict(int) + self.stacks = defaultdict(list) + self.max_frequency = 0 + + def push(self, val: int) -> None: + self.frequency[val] += 1 + self.max_frequency = max(self.max_frequency, self.frequency[val]) + self.stacks[self.frequency[val]].append(val) + + def pop(self) -> int: + if not self.stacks[self.max_frequency]: + return None + top_value = self.stacks[self.max_frequency].pop() + self.frequency[val] -= 1 + while self.max_frequency != 0 and not self.stacks[self.max_frequency]: + self.max_frequency -= 1 + return top_value diff --git a/grind75_hard/11_895. Maximum Frequency Stack/level_3.py b/grind75_hard/11_895. Maximum Frequency Stack/level_3.py new file mode 100644 index 0000000..ed69cda --- /dev/null +++ b/grind75_hard/11_895. Maximum Frequency Stack/level_3.py @@ -0,0 +1,18 @@ +class FreqStack: + + def __init__(self): + self.frequency = defaultdict(int) + self.stacks = defaultdict(list) + self.max_frequency = 0 + + def push(self, val: int) -> None: + self.frequency[val] += 1 + self.stacks[self.frequency[val]].append(val) + self.max_frequency = max(self.max_frequency, self.frequency[val]) + + def pop(self) -> int: + value = self.stacks[self.max_frequency].pop() + self.frequency[value] -= 1 + while self.max_frequency != 0 and not self.stacks[self.max_frequency]: + self.max_frequency -= 1 + return value