一、OrderedDict
1 class LRUCache:
2 def __init__(self, capacity: int):
3 from collections import OrderedDict
4 self.cap = capacity
5 self.dic = OrderedDict()
6 def get(self, key: int) -> int:
7 if key not in self.dic:
8 return -1
9 self.dic.move_to_end(key)
10 return self.dic[key]
11
12 def put(self, key: int, value: int) -> None:
13 if key in self.dic:
14 self.dic.move_to_end(key)
15 self.dic[key] = value
16 if len(self.dic) > self.cap:
17 self.dic.popitem(last=False)
18
19 # Your LRUCache object will be instantiated and called as such:
20 # obj = LRUCache(capacity)
21 # param_1 = obj.get(key)
22 # obj.put(key,value)
二、双向链表+dict
1 class DLinkedNode():
2 def __init__(self, key=0, value=0):
3 self.key = key
4 self.value = value
5 self.prev = None
6 self.next = None
7
8 class LRUCache:
9 def __init__(self, capacity: int):
10 self.cache = {}
11 self.size = 0
12 self.capacity = capacity
13 self.head, self.tail = DLinkedNode(), DLinkedNode()
14
15 self.head.next = self.tail
16 self.tail.prev = self.head
17
18 def _add_node(self, node):
19 node.prev = self.head
20 node.next = self.head.next
21
22 self.head.next.prev = node
23 self.head.next = node
24
25 def _remove_node(self, node):
26 prev = node.prev
27 new = node.next
28
29 prev.next = new
30 new.prev = prev
31
32 def _move_to_head(self, node):
33 self._remove_node(node)
34 self._add_node(node)
35
36 def _pop_tail(self):
37 res = self.tail.prev
38 self._remove_node(res)
39 return res
40
41 def get(self, key: int) -> int:
42 node = self.cache.get(key, None)
43 if not node:
44 return -1
45 self._move_to_head(node)
46 return node.value
47
48 def put(self, key: int, value: int) -> None:
49 node = self.cache.get(key)
50
51 if not node:
52 newNode = DLinkedNode(key, value)
53
54 self.cache[key] = newNode
55 self._add_node(newNode)
56
57 self.size += 1
58
59 if self.size > self.capacity:
60 tail = self._pop_tail()
61 del self.cache[tail.key]
62 self.size -= 1
63 else:
64 node.value = value
65 self._move_to_head(node)
66
67
68
69
70 # Your LRUCache object will be instantiated and called as such:
71 # obj = LRUCache(capacity)
72 # param_1 = obj.get(key)
73 # obj.put(key,value)