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