- private final Map<Integer, Integer> cnt = new HashMap<>();
- private final List<Deque<Integer>> stacks = new ArrayList<>();
- public void push(int val) {
- int c = cnt.getOrDefault(val, 0);
- if (c == stacks.size()) // 这个元素的频率已经是目前最多的,现在又出现了一次
- stacks.add(new ArrayDeque<>()); // 那么必须创建一个新栈
- stacks.get(c).push(val);
- cnt.put(val, c + 1); // 更新频率
- }
-
- public int pop() {
- int back = stacks.size() - 1;
- int val = stacks.get(back).pop(); // 弹出最右侧栈的栈顶
- if (stacks.get(back).isEmpty()) // 栈为空
- stacks.remove(back); // 删除
- cnt.put(val, cnt.get(val) - 1); // 更新频率
- return val;
- }