题目
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.pushcalls will not exceed 10000 in a single test case. - The total number of
FreqStack.popcalls will not exceed 10000 in a single test case. - The total number of
FreqStack.pushandFreqStack.popcalls 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 { |