题目
Implement FreqStack
, a class which simulates the operation of a stack-like data structure.
FreqStack
has two functions:
push(int x)
, which pushes an integer x onto the stack.pop()
, which removes and returns the most frequent element in the stack.- If there is a tie for most frequent element, the element closest to the top of the stack is removed and returned.
Example 1:
Input: ["FreqStack","push","push","push","push","push","push","pop","pop","pop","pop"],
[[],[5],[7],[5],[7],[4],[5],[],[],[],[]]
Output: [null,null,null,null,null,null,null,5,7,5,4]
Explanation:
After making six .push operations, the stack is [5,7,5,7,4,5]
from bottom to top. Then:
pop()
-> returns 5, as 5 is the most frequent.
The stack becomes [5,7,5,7,4]
.
pop()
-> returns 7, as 5 and 7 is the most frequent, but 7 is closest to the top.
The stack becomes [5,7,5,4]
.
pop()
-> returns 5.
The stack becomes [5,7,4]
.
pop()
-> returns 4.
The stack becomes [5,7]
.
Note:
- Calls to
FreqStack.push(int x)
will be such that 0 <= x <= 10^9. - It is guaranteed that
FreqStack.pop()
won’t be called if the stack has zero elements. - The total number of
FreqStack.push
calls will not exceed 10000 in a single test case. - The total number of
FreqStack.pop
calls will not exceed 10000 in a single test case. - The total number of
FreqStack.push
andFreqStack.pop
calls will not exceed 150000 across all test cases.
解析
设计数据结构的题, 选对基本数据结构是关键. 要pop
频率最高的元素, 就要统计每个元素出现频率. 用map<element, freq>
是个思路; 其次在元素频率相同时, pop
最近一次push
的元素, 将相同freq
的元素放入同一个stack
即可 => map<freq, stack<element>>
. 类成员变量里定义一个maxFreq
, 在出退栈时更新.
代码
c++
1 | class FreqStack { |