61 lines
1.4 KiB
Python
61 lines
1.4 KiB
Python
class Node:
|
|
def __init__(self, key, val):
|
|
self.key = key
|
|
self.val = val
|
|
self.prev = None
|
|
self.next = None
|
|
|
|
|
|
class LRUCache:
|
|
def __init__(self, capacity: int):
|
|
self.cap = capacity
|
|
self.cache = {}
|
|
self.left = Node(0, 0)
|
|
self.right = Node(0, 0)
|
|
self.left.next = self.right
|
|
self.right.prev = self.left
|
|
|
|
def remove(self, node):
|
|
p, n = node.prev, node.next
|
|
p.next = n
|
|
n.prev = p
|
|
|
|
def insert(self, node):
|
|
p, n = self.right.prev, self.right
|
|
p.next = node
|
|
node.prev = p
|
|
node.next = n
|
|
n.prev = node
|
|
|
|
def get(self, key: int) -> int:
|
|
if key not in self.cache:
|
|
return -1
|
|
node = self.cache[key]
|
|
self.remove(node)
|
|
self.insert(node)
|
|
return node.val
|
|
|
|
def put(self, key: int, value: int) -> None:
|
|
if key in self.cache:
|
|
self.remove(self.cache[key])
|
|
node = Node(key, value)
|
|
self.cache[key] = node
|
|
self.insert(node)
|
|
if len(self.cache) > self.cap:
|
|
lru = self.left.next
|
|
self.remove(lru)
|
|
del self.cache[lru.key]
|
|
|
|
|
|
if __name__ == "__main__":
|
|
lru = LRUCache(2)
|
|
lru.put(1, 1)
|
|
lru.put(2, 2)
|
|
print(lru.get(1))
|
|
lru.put(3, 3)
|
|
print(lru.get(2))
|
|
lru.put(4, 4)
|
|
print(lru.get(1))
|
|
print(lru.get(3))
|
|
print(lru.get(4))
|