版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Sengo_GWU/article/details/82930179
146. LRU Cache
解法一:OrderedDict , 太好用了,但是太取巧了
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.dic = collections.OrderedDict()
self.remain = capacity
def get(self, key):
"""
:type key: int
:rtype: int
"""
if key not in self.dic:
return -1
v = self.dic.pop(key)
self.dic[key] = v
return v
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
if key in self.dic:
self.dic.pop(key)
else:
if self.remain > 0:
self.remain -= 1
else:
self.dic.popitem(last=False)
self.dic[key] = value
方法二:链表结构,链表特点,如果节点没有被引用,则节点会被回收(删除)
class Node:
def __init__(self, key, value):
self.key = key
self.value = value
self.pre = None
self.next = None
class LRUCache(object):
def __init__(self, capacity):
"""
:type capacity: int
"""
self.dic = {}
self.capacity = capacity
self.head = Node(0, 0)
self.tail = Node(0, 0)
self.head.next = self.tail
self.tail.pre = self.head
def get(self, key):
"""
:type key: int
:rtype: int
"""
if key in self.dic:
node = self.dic[key]
self._remove(node)
self._add(node)
return node.value
else:
return -1
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
if key in self.dic:
self._remove(self.dic[key])
node = Node(key, value)
self._add(node)
self.dic[key] = node
if len(self.dic) > self.capacity:
n = self.head.next
self._remove(n)
del self.dic[n.key]
def _remove(self, node):
preNode = node.pre
nextNode = node.next
preNode.next = nextNode
nextNode.pre = preNode
def _add(self, node):
preNode = self.tail.pre
preNode.next = node
node.pre = preNode
node.next = self.tail
self.tail.pre = node