實作一個 FreqStack,類似 stack,但 pop() 會先從出現次數最高的最後一個開始,也就是 出現次數 > 位置 的順序。
這題導入了 Freq 的計數,因此要有一個計數的設計,用一個 HashTable 去記錄 val 對應的出現次數。
接下來要把 stack 套上以計數為優先的方式,出現最多次的一定先被 pop() 掉,對相同次數的來說,pop() 是正常的。
但對不同次數的來說,一定要先 pop() 光更多次的,才會輪到自己這一層。
如果連 push 五次同一個 val,那麼會是第五次的 val 先被 pop() ,才會換到第四次的 val,中間會有個換層的移動,如果已經pop()光就往下一層。
fruq = {1:[val], 2:[val], 3:[val], 4:[val], 5:[val]}
在計數的時候,各 val 計數的最高值也就是最優先要被 pop() 的那一層,用一個 MaxFreq 去記錄。
fruq[MaxFreq].pop() 過後,fruq[MaxFreq] == [] 時, MaxFreq -= 1 ,同時也要把 count[val] -= 1。
雖然標 hard,但非常快就解出了,感覺要定為 medium。不過結果我寫的跟官方的只有變數命名有差。
class FreqStack: def __init__(self): self.count = defaultdict(int) self.freq = defaultdict(list) self.MaxFreq = 0 def push(self, x: int) -> None: self.count[x] += 1 self.freq[self.count[x]].append(x) self.MaxFreq = max(self.MaxFreq, self.count[x]) def pop(self) -> int: num = self.freq[self.MaxFreq].pop() self.count[num] -= 1 if not self.freq[self.MaxFreq]: self.MaxFreq -= 1 return num