-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path146. LRU Cache.py
executable file
·148 lines (121 loc) · 3.74 KB
/
146. LRU Cache.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
'''
1.
'''
class Node:
def __init__(self, key, val, left=None, right=None):
self.key = key
self.val = val
self.left = left
self.right = right
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.head = Node(-1, -1)
self.head.left = self.head
self.head.right = self.head
self.dic = {} # {key: ListNode}
def get(self, key: int) -> int:
if key in self.dic:
node = self.dic[key]
self.moveToHead(node)
return node.val
else:
return -1
def put(self, key: int, value: int) -> None:
if key in self.dic:
node = self.dic[key]
node.val = value
self.moveToHead(node)
else:
node = Node(key, value)
self.dic[key] = node
self.moveToHead(node)
if self.size() > self.capacity:
node_to_remove = self.head.left
key_to_remove = node_to_remove.key
self.removeNode(node_to_remove)
self.removeKey(key_to_remove)
def size(self) -> int:
return len(self.dic)
def moveToHead(self, node):
if node.left and node.right:
self.removeNode(node)
node.left = self.head
node.right = self.head.right
node.left.right = node
node.right.left = node
def removeNode(self, node):
node.left.right = node.right
node.right.left = node.left
def removeKey(self, key):
self.dic.pop(key)
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)
'''
2.
'''
class Node:
def __init__(self, k, v):
self.key = k
self.val = v
self.prev = None
self.next = None
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.d = {}
self.head = Node(-1, -1)
self.tail = Node(-1, -1)
self.head.next = self.tail
self.tail.prev = self.head
def get(self, key: int) -> int:
# check if key is in d
if key in self.d:
# if is inside, get value, move to head
node = self.d[key]
self.removeNode(node)
self.addHead(node)
return node.val
# else return -1
else:
return -1
def put(self, key: int, value: int) -> None:
# check if key is in d
if key in self.d:
# if so update value
node = self.d[key]
node.val = value
# move it to the head
self.removeNode(node)
self.addHead(node)
# else create new entry in d
else:
node = Node(key, value)
# add new node to the head & d
self.addHead(node)
self.d[key] = node
# check capacity
if len(self.d) > self.capacity:
self.popTail()
# remove the node at given
def removeNode(self, node):
node.prev.next = node.next
node.next.prev = node.prev
# add the node at the head of the list
def addHead(self, node):
node.prev = self.head
node.next = self.head.next
node.next.prev = node
node.prev.next = node
# remove the node at the tail of the list
def popTail(self):
node = self.tail.prev
del self.d[node.key]
self.tail.prev = self.tail.prev.prev
self.tail.prev.next = self.tail
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)