- Translate each rule into one explicit state update.
- Maintain the invariant after every processed item.
- Return the accumulated state once all relevant input has been handled.
Code notes
- 65 lines of Python from the credited upstream file 460.py.
- The implementation visibly relies on sequence storage.
- No explicit loop blocks detected.
Complexity
Count the number and nesting of passes over the input, then include the maintained containers in the memory estimate.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
1class Node:2 def __init__(self, key: int, value: int, freq: int, it):3 self.key = key4 self.value = value5 self.freq = freq6 self.it = it7 8 9class LFUCache:10 def __init__(self, capacity: int):11 self.capacity = capacity12 self.minFreq = 013 self.keyToNode = {}14 self.freqToList = {}15 16 def get(self, key: int) -> int:17 if key not in self.keyToNode:18 return -119 20 node = self.keyToNode[key]21 self._touch(node)22 return node.value23 24 def put(self, key: int, value: int) -> None:25 if self.capacity == 0:26 return27 28 if key in self.keyToNode:29 node = self.keyToNode[key]30 node.value = value31 self._touch(node)32 return33 34 if len(self.keyToNode) == self.capacity:35 36 keyToEvict = self.freqToList[self.minFreq][-1]37 self.freqToList[self.minFreq].pop()38 del self.keyToNode[keyToEvict]39 40 self.minFreq = 141 if 1 not in self.freqToList:42 self.freqToList[1] = []43 self.freqToList[1].insert(0, key)44 self.keyToNode[key] = Node(key, value, 1, 0) 45 46 def _touch(self, node: Node) -> None:47 48 prevFreq = node.freq49 node.freq += 150 newFreq = node.freq51 52 53 self.freqToList[prevFreq].remove(node.key)54 if not self.freqToList[prevFreq]:55 del self.freqToList[prevFreq]56 57 if prevFreq == self.minFreq:58 self.minFreq += 159 60 61 if newFreq not in self.freqToList:62 self.freqToList[newFreq] = []63 self.freqToList[newFreq].insert(0, node.key)64 node.it = 0 65