Сложность: hard
Разработайте структуру данных, похожую на стек, чтобы заталкивать элементы в стек и вытаскивать из него самый частый элемент. Реализуйте класс FreqStack: FreqStack() строит пустой стек частот. void push(int val) заталкивает целое число val на вершину стека. int pop() удаляет и возвращает самый частый элемент в стеке. Если есть равенство в выборе самого частого элемента, то удаляется и возвращается элемент, который ближе всего к вершине стека.
Пример:
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]
👨💻 Алгоритм:
1⃣Создать два словаря: freq для хранения частоты каждого элемента и group для хранения стека элементов для каждой частоты.
2⃣При добавлении элемента увеличивать его частоту в freq и добавлять его в стек соответствующей частоты в group.
3⃣При извлечении элемента найти максимальную частоту, удалить элемент из стека соответствующей частоты и уменьшить его частоту в freq. Если стек для данной частоты становится пустым, удалить его.
😎 Решение:
import java.util.*;
class FreqStack {
private Map<Integer, Integer> freq;
private Map<Integer, Stack<Integer>> group;
private int maxfreq;
public FreqStack() {
freq = new HashMap<>();
group = new HashMap<>();
maxfreq = 0;
}
public void push(int val) {
int f = freq.getOrDefault(val, 0) + 1;
freq.put(val, f);
if (f > maxfreq) {
maxfreq = f;
group.put(f, new Stack<>());
}
group.get(f).push(val);
}
public int pop() {
int val = group.get(maxfreq).pop();
freq.put(val, freq.get(val) - 1);
if (group.get(maxfreq).isEmpty()) {
maxfreq--;
}
return val;
}
}
Ставь 👍 и забирай 📚 Базу знаний