Faaez Razeen

LRU Cache

  • 2 min read
  • LC-Medium
  • Linked List

3 years ago

Solution

TimeSpaceExplanation
O(1)O(?)
class Node: def __init__(self, key, val): self.key, self.val = key, val self.prev, self.next = None, None class LRUCache: def __init__(self, capacity: int): self.size = 0 self.capacity = capacity self.nodes = {} # key: Node(value) self.head, self.tail = Node(0, 0), Node(0, 0) self.head.next = self.tail self.tail.prev = self.head def insert(self, key, val): node = Node(key, val) if self.size == self.capacity: # If capacity is reached, remove LRU node, which the node before tail self.remove(self.tail.prev.key) self.nodes[key] = node self.head.next.prev = node node.next = self.head.next node.prev = self.head self.head.next = node self.size += 1 def remove(self, key): node = self.nodes[key] node.prev.next = node.next node.next.prev = node.prev del self.nodes[key] self.size -= 1 return node def get(self, key: int) -> int: if key not in self.nodes: return -1 removed_node = self.remove(key) self.insert(key, removed_node.val) return removed_node.val def put(self, key: int, value: int) -> None: if key in self.nodes: self.remove(key) self.insert(key, value)