Skip to content

Commit 719c957

Browse files
committed
2020-10-16
1 parent 83e4f99 commit 719c957

File tree

2 files changed

+127
-16
lines changed

2 files changed

+127
-16
lines changed

0146.LRU缓存机制/0146-LRU缓存机制.py

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,74 @@
1-
class LRUCache(object):
1+
class DLLNode(object):
2+
def __init__(self, key, val, pre, nxt):
3+
self.key = key
4+
self.val = val
5+
self.pre = pre
6+
self.nxt = next
27

8+
class LRUCache(object):
39
def __init__(self, capacity):
410
"""
511
:type capacity: int
612
"""
7-
from collections import OrderedDict
813
self.capacity = capacity
9-
self.record = OrderedDict()
14+
self.size = 0
15+
self.head = DLLNode(-1, -1, None, None)
16+
self.tail = DLLNode(-1, -1, self.head, None)
17+
self.head.next = self.tail
18+
self.dic = dict()
1019

1120
def get(self, key):
1221
"""
1322
:type key: int
1423
:rtype: int
1524
"""
16-
if key in self.record:
17-
tmp = self.record.pop(key)
18-
self.record[key] = tmp
19-
return tmp
20-
else:
25+
if key not in self.dic:
2126
return -1
22-
27+
else:
28+
value = self.dic[key].val
29+
self.moveToHead(self.dic[key])
30+
return value
2331

2432
def put(self, key, value):
2533
"""
2634
:type key: int
2735
:type value: int
2836
:rtype: None
2937
"""
30-
if key in self.record:
31-
self.record.pop(key)
32-
else:
33-
if self.capacity > 0:
34-
self.capacity -= 1
38+
if key not in self.dic:
39+
node = DLLNode(key, value, None, None)
40+
self.dic[key] = node
41+
if self.size < self.capacity:
42+
self.size += 1
3543
else:
36-
self.record.popitem(last = False)
37-
self.record[key] = value
44+
self.removeLastElement()
45+
self.insertToHead(node)
46+
else:
47+
self.dic[key].val = value
48+
self.moveToHead(self.dic[key])
49+
50+
def insertToHead(self, node):
51+
52+
pre_first = self.head.next
53+
self.head.next = node
54+
node.pre = self.head
55+
pre_first.pre = node
56+
node.next = pre_first
3857

58+
# print (node.key, node.pre.key, node.next.key)
59+
60+
def removeLastElement(self):
61+
pre_last = self.tail.pre
62+
pre_second_last = pre_last.pre
63+
pre_second_last.next = self.tail
64+
self.tail.pre = pre_second_last
65+
self.dic.pop(pre_last.key)
66+
67+
def moveToHead(self, node):
68+
node.pre.next = node.next
69+
node.next.pre = node.pre
70+
71+
self.insertToHead(node)
3972

4073

4174
# Your LRUCache object will be instantiated and called as such:
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
class DLLNode(object):
2+
def __init__(self, key, val, pre = None, next = None):
3+
self.key = key
4+
self.val = val
5+
self.pre = pre
6+
self.next = next
7+
8+
class LRUCache(object):
9+
def __init__(self, capacity):
10+
"""
11+
:type capacity: int
12+
"""
13+
self.capacity = capacity
14+
self.size = 0
15+
self.head = DLLNode(-1, -1)
16+
self.tail = DLLNode(-1, -1, self.head)
17+
self.head.next = self.tail
18+
self.dic = {}
19+
20+
def get(self, key):
21+
"""
22+
:type key: int
23+
:rtype: int
24+
"""
25+
if key in self.dic:
26+
res = self.dic[key].val
27+
self.moveToHead(self.dic[key]) # set this node to be most recently used
28+
return res
29+
return -1
30+
31+
def put(self, key, value):
32+
"""
33+
:type key: int
34+
:type value: int
35+
:rtype: None
36+
"""
37+
if key in self.dic:
38+
self.dic[key].val = value
39+
self.moveToHead(self.dic[key])
40+
else:
41+
node = DLLNode(key, value)
42+
self.dic[key] = node
43+
if self.size < self.capacity:
44+
self.size += 1
45+
else:
46+
self.removeLastNode()
47+
self.insertToHead(node)
48+
49+
def insertToHead(self, node):
50+
pre_first = self.head.next
51+
self.head.next = node
52+
node.pre = self.head
53+
node.next = pre_first
54+
pre_first.pre = node
55+
56+
def moveToHead(self, node):
57+
# 1. take it out
58+
node.pre.next = node.next
59+
node.next.pre = node.pre
60+
# 2. insert it to the head
61+
self.insertToHead(node)
62+
63+
def removeLastNode(self):
64+
pre_last = self.tail.pre
65+
pre_second_last = pre_last.pre
66+
67+
pre_second_last.next = self.tail
68+
self.tail.pre = pre_second_last
69+
70+
self.dic.pop(pre_last.key)
71+
72+
73+
74+
75+
# Your LRUCache object will be instantiated and called as such:
76+
# obj = LRUCache(capacity)
77+
# param_1 = obj.get(key)
78+
# obj.put(key,value)

0 commit comments

Comments
 (0)