题目地址:
https://leetcode.com/problems/maximum-frequency-stack/
要求设计一个数据结构,能实现下面操作:
1、添加一个数;
2、删除掉出现次数最多的那个数,如果有多个数出现的次数相同,则要删除其中最后添加的那个数。
思路是,用一个哈希表记录每个元素出现了多少次,然后再用一个每个元素都是栈的列表 A A A记录出现次数相同的元素的添加次序。例如, A [ 0 ] A[0] A[0]记录每个至少出现一次的数, A [ 1 ] A[1] A[1]记录每个至少出现两次的数。在push的时候,先查一下哈希表,看一下这个数出现了多少次,如果出现了 i i i次,那么就将其push进 A [ i ] A[i] A[i]的栈中。pop的时候,将 A A A最后一个非空的栈pop即可。注意要时刻维护哈希表存的每个数的出现次数。代码如下:
import java.util.*;
public class FreqStack {
private Map<Integer, Integer> freq;
private List<Deque<Integer>> list;
public FreqStack() {
freq = new HashMap<>();
list = new ArrayList<>();
}
public void push(int x) {
freq.put(x, freq.getOrDefault(x, 0) + 1);
if (list.size() < freq.get(x)) {
list.add(new ArrayDeque<>());
}
list.get(freq.get(x) - 1).push(x);
}
public int pop() {
// 把最后一个空栈删掉
if (!list.isEmpty() && list.get(list.size() - 1).isEmpty()) {
list.remove(list.size() - 1);
}
int res = list.get(list.size() - 1).pop();
freq.put(res, freq.get(res) - 1);
return res;
}
}
所有操作时间复杂度 O ( 1 ) O(1) O(1),空间取决于具体操作。