Skip to content

Commit c1c7f91

Browse files
authored
Create 0460-lfu-cache.java
1 parent 1dd97f0 commit c1c7f91

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

java/0460-lfu-cache.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
class LFUCache {
2+
private static class Entry {
3+
int key;
4+
int value;
5+
int freq;
6+
7+
public Entry(int key, int value, int freq) {
8+
this.key = key;
9+
this.value = value;
10+
this.freq = freq;
11+
}
12+
}
13+
14+
private final int capacity;
15+
private int minFreq = 0;
16+
private final Map<Integer, Entry> entries = new HashMap<>();
17+
private final Map<Integer, LinkedHashSet<Entry>> freqMap = new HashMap<>();
18+
19+
public LFUCache(int capacity) {
20+
this.capacity = capacity;
21+
}
22+
23+
public int get(int key) {
24+
Entry e = entries.get(key);
25+
if (e == null) return -1;
26+
updateFrequency(e);
27+
return e.value;
28+
}
29+
30+
public void put(int key, int value) {
31+
if (capacity == 0) return;
32+
if (entries.containsKey(key)) {
33+
Entry e = entries.get(key);
34+
e.value = value;
35+
updateFrequency(e);
36+
} else {
37+
if (entries.size() == capacity) {
38+
evictLeastFrequent();
39+
}
40+
Entry e = new Entry(key, value, 1);
41+
entries.put(key, e);
42+
freqMap.computeIfAbsent(1, k -> new LinkedHashSet<>()).add(e);
43+
minFreq = 1; // Reset min frequency to 1 for new entry
44+
}
45+
}
46+
47+
private void updateFrequency(Entry e) {
48+
int oldFreq = e.freq;
49+
int newFreq = oldFreq + 1;
50+
51+
freqMap.get(oldFreq).remove(e);
52+
if (freqMap.get(oldFreq).isEmpty()) {
53+
freqMap.remove(oldFreq);
54+
if (minFreq == oldFreq) minFreq++;
55+
}
56+
57+
e.freq = newFreq;
58+
freqMap.computeIfAbsent(newFreq, k -> new LinkedHashSet<>()).add(e);
59+
}
60+
61+
private void evictLeastFrequent() {
62+
LinkedHashSet<Entry> minFreqEntries = freqMap.get(minFreq);
63+
Entry toRemove = minFreqEntries.iterator().next();
64+
minFreqEntries.remove(toRemove);
65+
if (minFreqEntries.isEmpty()) {
66+
freqMap.remove(minFreq);
67+
}
68+
69+
entries.remove(toRemove.key);
70+
}
71+
}

0 commit comments

Comments
 (0)