1、堆栈数组
考虑到我们既需要维护每个元素出现的次数,又需要维护每个元素在堆栈中的位置。最理想的方法就是使用哈希表来记录每个元素出现的次数,而后我们使用堆栈数组来实现元素个数的变动以及同一频率内的后进先出。我们在添加元素以及删除元素时,需要额外对添加新元素以及删除空元素的情况进行考虑。
class FreqStack {
unordered_map<int, int> cnt;
vector<stack<int>> stacks;
public:
void push(int val) {
if (cnt[val] == stacks.size())
stacks.push_back({});
stacks[cnt[val]].push(val);
++cnt[val];
}
int pop() {
int val = stacks.back().top();
stacks.back().pop();
if (stacks.back().empty())
stacks.pop_back();
--cnt[val];
return val;
}
};