class LFUCache {
struct Entry { int key, value, freq; long long used; };
vector<Entry> entries;
long long clock = 0;
int capacity;
public:
LFUCache(int capacity) : capacity(capacity) {}
int get(int key) {
Entry* e = nullptr; for (auto& x : entries) if (x.key == key) { e = &x; break; }
if (!e) return -1;
e->freq++;
e->used = ++clock;
return e->value;
}
void put(int key, int value) {
if (capacity <= 0) return;
Entry* e = nullptr; for (auto& x : entries) if (x.key == key) { e = &x; break; }
if (e) {
e->value = value;
e->freq++;
e->used = ++clock;
return;
}
if ((int)entries.size() == capacity) {
int victim = 0;
for (int i = 1; i < (int)entries.size(); i++) {
const Entry& a = entries[i]; const Entry& b = entries[victim];
if (a.freq < b.freq || (a.freq == b.freq && a.used < b.used)) victim = i;
}
entries.erase(entries.begin() + victim);
}
entries.push_back({key, value, 1, ++clock});
}
};
class LFUCache {
private List<int[]> entries = new ArrayList<>(); // {key, value, freq, used}
private int clock = 0;
private int capacity;
public LFUCache(int capacity) { this.capacity = capacity; }
private int[] find(int key) {
for (int[] x : entries) if (x[0] == key) return x;
return null;
}
public int get(int key) {
int[] e = find(key);
if (e == null) return -1;
e[2]++;
e[3] = ++clock;
return e[1];
}
public void put(int key, int value) {
if (capacity <= 0) return;
int[] e = find(key);
if (e != null) {
e[1] = value;
e[2]++;
e[3] = ++clock;
return;
}
if (entries.size() == capacity) {
int victim = 0;
for (int i = 1; i < entries.size(); i++) {
int[] a = entries.get(i), b = entries.get(victim);
if (a[2] < b[2] || (a[2] == b[2] && a[3] < b[3])) victim = i;
}
entries.remove(victim);
}
entries.add(new int[]{key, value, 1, ++clock});
}
}
class LFUCache:
def __init__(self, capacity):
self.capacity = capacity
self.entries = [] # each entry: [key, value, freq, used]
self.clock = 0
def _find(self, key):
for x in self.entries:
if x[0] == key: return x
return None
def get(self, key):
e = self._find(key)
if e is None: return -1
e[2] += 1
self.clock += 1; e[3] = self.clock
return e[1]
def put(self, key, value):
if self.capacity <= 0: return
e = self._find(key)
if e is not None:
e[1] = value
e[2] += 1
self.clock += 1; e[3] = self.clock
return
if len(self.entries) == self.capacity:
victim = 0
for i in range(1, len(self.entries)):
a, b = self.entries[i], self.entries[victim]
if a[2] < b[2] or (a[2] == b[2] and a[3] < b[3]): victim = i
self.entries.pop(victim)
self.clock += 1
self.entries.append([key, value, 1, self.clock])
class LFUCache {
private entries: { key: number; value: number; freq: number; used: number }[] = [];
private clock = 0;
constructor(private capacity: number) {}
get(key: number): number {
const e = this.entries.find((x) => x.key === key);
if (!e) return -1;
e.freq++;
e.used = ++this.clock;
return e.value;
}
put(key: number, value: number): void {
if (this.capacity <= 0) return;
const e = this.entries.find((x) => x.key === key);
if (e) {
e.value = value;
e.freq++;
e.used = ++this.clock;
return;
}
if (this.entries.length === this.capacity) {
let victim = 0;
for (let i = 1; i < this.entries.length; i++) {
const a = this.entries[i], b = this.entries[victim];
if (a.freq < b.freq || (a.freq === b.freq && a.used < b.used)) victim = i;
}
this.entries.splice(victim, 1);
}
this.entries.push({ key, value, freq: 1, used: ++this.clock });
}
}
class LFUCache {
unordered_map<int, int> values;
unordered_map<int, int> freqOf;
unordered_map<int, list<int>> buckets; // front = most recently used
int minFreq = 0;
int capacity;
void bump(int key) {
int f = freqOf[key];
list<int>& bucket = buckets[f];
bucket.remove(key);
if (bucket.empty()) {
buckets.erase(f);
if (minFreq == f) minFreq = f + 1;
}
freqOf[key] = f + 1;
buckets[f + 1].push_front(key);
}
public:
LFUCache(int capacity) : capacity(capacity) {}
int get(int key) {
if (!values.count(key)) return -1;
bump(key);
return values[key];
}
void put(int key, int value) {
if (capacity <= 0) return;
if (values.count(key)) {
values[key] = value;
bump(key);
return;
}
if ((int)values.size() == capacity) {
list<int>& bucket = buckets[minFreq];
int victim = bucket.back(); bucket.pop_back();
if (bucket.empty()) buckets.erase(minFreq);
values.erase(victim);
freqOf.erase(victim);
}
values[key] = value;
freqOf[key] = 1;
buckets[1].push_front(key);
minFreq = 1;
}
};
class LFUCache {
private Map<Integer, Integer> values = new HashMap<>();
private Map<Integer, Integer> freqOf = new HashMap<>();
private Map<Integer, List<Integer>> buckets = new HashMap<>(); // index 0 = most recently used
private int minFreq = 0;
private int capacity;
public LFUCache(int capacity) { this.capacity = capacity; }
private void bump(int key) {
int f = freqOf.get(key);
List<Integer> bucket = buckets.get(f);
bucket.remove(Integer.valueOf(key));
if (bucket.isEmpty()) {
buckets.remove(f);
if (minFreq == f) minFreq = f + 1;
}
freqOf.put(key, f + 1);
buckets.computeIfAbsent(f + 1, k -> new ArrayList<>()).add(0, key);
}
public int get(int key) {
if (!values.containsKey(key)) return -1;
bump(key);
return values.get(key);
}
public void put(int key, int value) {
if (capacity <= 0) return;
if (values.containsKey(key)) {
values.put(key, value);
bump(key);
return;
}
if (values.size() == capacity) {
List<Integer> bucket = buckets.get(minFreq);
int victim = bucket.remove(bucket.size() - 1);
if (bucket.isEmpty()) buckets.remove(minFreq);
values.remove(victim);
freqOf.remove(victim);
}
values.put(key, value);
freqOf.put(key, 1);
buckets.computeIfAbsent(1, k -> new ArrayList<>()).add(0, key);
minFreq = 1;
}
}
class LFUCache:
def __init__(self, capacity):
self.capacity = capacity
self.values = {}
self.freq_of = {}
self.buckets = {} # freq -> keys, index 0 = most recently used
self.min_freq = 0
def _bump(self, key):
f = self.freq_of[key]
bucket = self.buckets[f]
bucket.remove(key)
if not bucket:
del self.buckets[f]
if self.min_freq == f: self.min_freq = f + 1
self.freq_of[key] = f + 1
self.buckets.setdefault(f + 1, []).insert(0, key)
def get(self, key):
if key not in self.values: return -1
self._bump(key)
return self.values[key]
def put(self, key, value):
if self.capacity <= 0: return
if key in self.values:
self.values[key] = value
self._bump(key)
return
if len(self.values) == self.capacity:
bucket = self.buckets[self.min_freq]
victim = bucket.pop()
if not bucket: del self.buckets[self.min_freq]
del self.values[victim]
del self.freq_of[victim]
self.values[key] = value
self.freq_of[key] = 1
self.buckets.setdefault(1, []).insert(0, key)
self.min_freq = 1
class LFUCache {
private values = new Map<number, number>();
private freqOf = new Map<number, number>();
private buckets = new Map<number, number[]>();
private minFreq = 0;
constructor(private capacity: number) {}
private bump(key: number): void {
const f = this.freqOf.get(key)!;
const bucket = this.buckets.get(f)!;
bucket.splice(bucket.indexOf(key), 1);
if (bucket.length === 0) {
this.buckets.delete(f);
if (this.minFreq === f) this.minFreq = f + 1;
}
this.freqOf.set(key, f + 1);
if (!this.buckets.has(f + 1)) this.buckets.set(f + 1, []);
this.buckets.get(f + 1)!.unshift(key);
}
get(key: number): number {
if (!this.values.has(key)) return -1;
this.bump(key);
return this.values.get(key)!;
}
put(key: number, value: number): void {
if (this.capacity <= 0) return;
if (this.values.has(key)) {
this.values.set(key, value);
this.bump(key);
return;
}
if (this.values.size === this.capacity) {
const bucket = this.buckets.get(this.minFreq)!;
const victim = bucket.pop()!;
if (bucket.length === 0) this.buckets.delete(this.minFreq);
this.values.delete(victim);
this.freqOf.delete(victim);
}
this.values.set(key, value);
this.freqOf.set(key, 1);
if (!this.buckets.has(1)) this.buckets.set(1, []);
this.buckets.get(1)!.unshift(key);
this.minFreq = 1;
}
}
class LFUCache {
unordered_map<int, int> values;
unordered_map<int, int> freqOf;
unordered_map<int, list<int>> buckets; // front = oldest, back = newest
unordered_map<int, list<int>::iterator> where;
int minFreq = 0;
int capacity;
void bump(int key) {
int f = freqOf[key];
list<int>& bucket = buckets[f];
bucket.erase(where[key]);
if (bucket.empty()) {
buckets.erase(f);
if (minFreq == f) minFreq = f + 1;
}
freqOf[key] = f + 1;
list<int>& next = buckets[f + 1];
next.push_back(key); where[key] = prev(next.end());
}
public:
LFUCache(int capacity) : capacity(capacity) {}
int get(int key) {
if (!values.count(key)) return -1;
bump(key);
return values[key];
}
void put(int key, int value) {
if (capacity <= 0) return;
if (values.count(key)) {
values[key] = value;
bump(key);
return;
}
if ((int)values.size() == capacity) {
list<int>& bucket = buckets[minFreq];
int victim = bucket.front();
bucket.pop_front();
if (bucket.empty()) buckets.erase(minFreq);
values.erase(victim);
freqOf.erase(victim); where.erase(victim);
}
values[key] = value;
freqOf[key] = 1;
list<int>& first = buckets[1];
first.push_back(key); where[key] = prev(first.end());
minFreq = 1;
}
};
class LFUCache {
private Map<Integer, Integer> values = new HashMap<>();
private Map<Integer, Integer> freqOf = new HashMap<>();
private Map<Integer, LinkedHashSet<Integer>> buckets = new HashMap<>();
private int minFreq = 0;
private int capacity;
public LFUCache(int capacity) { this.capacity = capacity; }
private void bump(int key) {
int f = freqOf.get(key);
LinkedHashSet<Integer> bucket = buckets.get(f);
bucket.remove(key);
if (bucket.isEmpty()) {
buckets.remove(f);
if (minFreq == f) minFreq = f + 1;
}
freqOf.put(key, f + 1);
buckets.computeIfAbsent(f + 1, k -> new LinkedHashSet<>()).add(key);
}
public int get(int key) {
if (!values.containsKey(key)) return -1;
bump(key);
return values.get(key);
}
public void put(int key, int value) {
if (capacity <= 0) return;
if (values.containsKey(key)) {
values.put(key, value);
bump(key);
return;
}
if (values.size() == capacity) {
LinkedHashSet<Integer> bucket = buckets.get(minFreq);
int victim = bucket.iterator().next();
bucket.remove(victim);
if (bucket.isEmpty()) buckets.remove(minFreq);
values.remove(victim);
freqOf.remove(victim);
}
values.put(key, value);
freqOf.put(key, 1);
buckets.computeIfAbsent(1, k -> new LinkedHashSet<>()).add(key);
minFreq = 1;
}
}
class LFUCache:
def __init__(self, capacity):
self.capacity = capacity
self.values = {}
self.freq_of = {}
self.buckets = {} # freq -> dict used as an insertion-ordered set (oldest first)
self.min_freq = 0
def _bump(self, key):
f = self.freq_of[key]
bucket = self.buckets[f]
del bucket[key]
if not bucket:
del self.buckets[f]
if self.min_freq == f: self.min_freq = f + 1
self.freq_of[key] = f + 1
self.buckets.setdefault(f + 1, {})[key] = None
def get(self, key):
if key not in self.values: return -1
self._bump(key)
return self.values[key]
def put(self, key, value):
if self.capacity <= 0: return
if key in self.values:
self.values[key] = value
self._bump(key)
return
if len(self.values) == self.capacity:
bucket = self.buckets[self.min_freq]
victim = next(iter(bucket))
del bucket[victim]
if not bucket: del self.buckets[self.min_freq]
del self.values[victim]
del self.freq_of[victim]
self.values[key] = value
self.freq_of[key] = 1
self.buckets.setdefault(1, {})[key] = None
self.min_freq = 1
class LFUCache {
private values = new Map<number, number>();
private freqOf = new Map<number, number>();
private buckets = new Map<number, Set<number>>();
private minFreq = 0;
constructor(private capacity: number) {}
private bump(key: number): void {
const f = this.freqOf.get(key)!;
const bucket = this.buckets.get(f)!;
bucket.delete(key);
if (bucket.size === 0) {
this.buckets.delete(f);
if (this.minFreq === f) this.minFreq = f + 1;
}
this.freqOf.set(key, f + 1);
if (!this.buckets.has(f + 1)) this.buckets.set(f + 1, new Set());
this.buckets.get(f + 1)!.add(key);
}
get(key: number): number {
if (!this.values.has(key)) return -1;
this.bump(key);
return this.values.get(key)!;
}
put(key: number, value: number): void {
if (this.capacity <= 0) return;
if (this.values.has(key)) {
this.values.set(key, value);
this.bump(key);
return;
}
if (this.values.size === this.capacity) {
const bucket = this.buckets.get(this.minFreq)!;
const victim = bucket.values().next().value as number;
bucket.delete(victim);
if (bucket.size === 0) this.buckets.delete(this.minFreq);
this.values.delete(victim);
this.freqOf.delete(victim);
}
this.values.set(key, value);
this.freqOf.set(key, 1);
if (!this.buckets.has(1)) this.buckets.set(1, new Set());
this.buckets.get(1)!.add(key);
this.minFreq = 1;
}
}
struct Node {
int key, value, freq; Node *prev, *next;
Node(int k, int v, int f = 1) : key(k), value(v), freq(f), prev(nullptr), next(nullptr) {}
};
struct FreqList {
Node* head = new Node(0, 0, 0);
Node* tail = new Node(0, 0, 0);
int size = 0;
FreqList() { head->next = tail; tail->prev = head; }
void addFront(Node* node) {
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
size++;
}
void remove(Node* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
size--;
}
Node* removeLast() {
Node* node = tail->prev;
remove(node);
return node;
}
};
class LFUCache {
unordered_map<int, Node*> nodes;
unordered_map<int, FreqList*> lists;
int minFreq = 0;
int capacity;
void bump(Node* node) {
FreqList* list = lists[node->freq];
list->remove(node);
if (list->size == 0) {
lists.erase(node->freq); delete list;
if (minFreq == node->freq) minFreq++;
}
node->freq++;
FreqList*& next = lists[node->freq];
if (!next) next = new FreqList();
next->addFront(node);
}
public:
LFUCache(int capacity) : capacity(capacity) {}
int get(int key) {
auto it = nodes.find(key);
Node* node = it == nodes.end() ? nullptr : it->second;
if (!node) return -1;
bump(node);
return node->value;
}
void put(int key, int value) {
if (capacity <= 0) return;
auto it = nodes.find(key);
Node* existing = it == nodes.end() ? nullptr : it->second;
if (existing) {
existing->value = value;
bump(existing);
return;
}
if ((int)nodes.size() == capacity) {
FreqList* list = lists[minFreq];
Node* victim = list->removeLast();
if (list->size == 0) { lists.erase(minFreq); delete list; }
nodes.erase(victim->key);
delete victim;
}
Node* node = new Node(key, value);
nodes[key] = node;
FreqList*& first = lists[1];
if (!first) first = new FreqList();
first->addFront(node);
minFreq = 1;
}
};
class Node {
int key, value, freq; Node prev, next;
Node(int key, int value, int freq) { this.key = key; this.value = value; this.freq = freq; }
}
class FreqList {
final Node head = new Node(0, 0, 0);
final Node tail = new Node(0, 0, 0);
int size = 0;
FreqList() { head.next = tail; tail.prev = head; }
void addFront(Node node) {
node.next = head.next;
node.prev = head;
head.next.prev = node;
head.next = node;
size++;
}
void remove(Node node) {
node.prev.next = node.next;
node.next.prev = node.prev;
size--;
}
Node removeLast() {
Node node = tail.prev;
remove(node);
return node;
}
}
class LFUCache {
private Map<Integer, Node> nodes = new HashMap<>();
private Map<Integer, FreqList> lists = new HashMap<>();
private int minFreq = 0;
private int capacity;
public LFUCache(int capacity) { this.capacity = capacity; }
private void bump(Node node) {
FreqList list = lists.get(node.freq);
list.remove(node);
if (list.size == 0) {
lists.remove(node.freq);
if (minFreq == node.freq) minFreq++;
}
node.freq++;
FreqList next = lists.get(node.freq);
if (next == null) { next = new FreqList(); lists.put(node.freq, next); }
next.addFront(node);
}
public int get(int key) {
Node node = nodes.get(key);
if (node == null) return -1;
bump(node);
return node.value;
}
public void put(int key, int value) {
if (capacity <= 0) return;
Node existing = nodes.get(key);
if (existing != null) {
existing.value = value;
bump(existing);
return;
}
if (nodes.size() == capacity) {
FreqList list = lists.get(minFreq);
Node victim = list.removeLast();
if (list.size == 0) lists.remove(minFreq);
nodes.remove(victim.key);
}
Node node = new Node(key, value, 1);
nodes.put(key, node);
FreqList first = lists.get(1);
if (first == null) { first = new FreqList(); lists.put(1, first); }
first.addFront(node);
minFreq = 1;
}
}
class Node:
def __init__(self, key, value, freq=1):
self.key = key
self.value = value
self.freq = freq
self.prev = None
self.next = None
class FreqList:
def __init__(self):
self.head = Node(0, 0, 0)
self.tail = Node(0, 0, 0)
self.size = 0
self.head.next = self.tail
self.tail.prev = self.head
def add_front(self, node):
node.next = self.head.next
node.prev = self.head
self.head.next.prev = node
self.head.next = node
self.size += 1
def remove(self, node):
node.prev.next = node.next
node.next.prev = node.prev
self.size -= 1
def remove_last(self):
node = self.tail.prev
self.remove(node)
return node
class LFUCache:
def __init__(self, capacity):
self.capacity = capacity
self.nodes = {}
self.lists = {}
self.min_freq = 0
def _bump(self, node):
lst = self.lists[node.freq]
lst.remove(node)
if lst.size == 0:
del self.lists[node.freq]
if self.min_freq == node.freq: self.min_freq += 1
node.freq += 1
nxt = self.lists.get(node.freq)
if nxt is None:
nxt = FreqList(); self.lists[node.freq] = nxt
nxt.add_front(node)
def get(self, key):
node = self.nodes.get(key)
if node is None: return -1
self._bump(node)
return node.value
def put(self, key, value):
if self.capacity <= 0: return
existing = self.nodes.get(key)
if existing is not None:
existing.value = value
self._bump(existing)
return
if len(self.nodes) == self.capacity:
lst = self.lists[self.min_freq]
victim = lst.remove_last()
if lst.size == 0: del self.lists[self.min_freq]
del self.nodes[victim.key]
node = Node(key, value)
self.nodes[key] = node
first = self.lists.get(1)
if first is None:
first = FreqList(); self.lists[1] = first
first.add_front(node)
self.min_freq = 1
class Node {
constructor(public key: number, public value: number, public freq = 1, public prev: Node | null = null, public next: Node | null = null) {}
}
class FreqList {
readonly head = new Node(0, 0, 0);
readonly tail = new Node(0, 0, 0);
size = 0;
constructor() { this.head.next = this.tail; this.tail.prev = this.head; }
addFront(node: Node): void {
node.next = this.head.next;
node.prev = this.head;
this.head.next!.prev = node;
this.head.next = node;
this.size++;
}
remove(node: Node): void {
node.prev!.next = node.next;
node.next!.prev = node.prev;
this.size--;
}
removeLast(): Node {
const node = this.tail.prev!;
this.remove(node);
return node;
}
}
class LFUCache {
private nodes = new Map<number, Node>();
private lists = new Map<number, FreqList>();
private minFreq = 0;
constructor(private capacity: number) {}
private bump(node: Node): void {
const list = this.lists.get(node.freq)!;
list.remove(node);
if (list.size === 0) {
this.lists.delete(node.freq);
if (this.minFreq === node.freq) this.minFreq++;
}
node.freq++;
let next = this.lists.get(node.freq);
if (!next) { next = new FreqList(); this.lists.set(node.freq, next); }
next.addFront(node);
}
get(key: number): number {
const node = this.nodes.get(key);
if (!node) return -1;
this.bump(node);
return node.value;
}
put(key: number, value: number): void {
if (this.capacity <= 0) return;
const existing = this.nodes.get(key);
if (existing) {
existing.value = value;
this.bump(existing);
return;
}
if (this.nodes.size === this.capacity) {
const list = this.lists.get(this.minFreq)!;
const victim = list.removeLast();
if (list.size === 0) this.lists.delete(this.minFreq);
this.nodes.delete(victim.key);
}
const node = new Node(key, value);
this.nodes.set(key, node);
let first = this.lists.get(1);
if (!first) { first = new FreqList(); this.lists.set(1, first); }
first.addFront(node);
this.minFreq = 1;
}
}