题目:原题链接(中等)
标签:设计、队列
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | 所有操作 = O ( 1 ) O(1) O(1) | O ( N ) O(N) O(N) | 196ms (86.92%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一(双端队列):
class LRUCache:
class Node:
__slots__ = ("key", "value", "prev", "next")
def __init__(self, key, value):
self.key = key
self.value = value
self.prev = None
self.next = None
def __init__(self, capacity: int):
self.capacity = capacity
# 定义当前缓存容量
self.n = 0
# 定义映射
self.dict = {}
# 定义双端队列
self.head = self.Node(0, 0)
self.tail = self.Node(0, 0)
self.head.prev = self.tail
self.tail.prev = self.head
def _update(self, key):
"""将当前节点移动到队尾"""
node = self.dict[key]
# 从当前位置移除节点
node.prev.next, node.next.prev = node.next, node.prev
# 将节点添加到队尾
node.prev = self.tail.prev
node.next = self.tail
self.tail.prev.next = node
self.tail.prev = node
def get(self, key: int) -> int:
if key in self.dict:
self._update(key)
return self.dict[key].value
else:
return -1
def put(self, key: int, value: int) -> None:
if key not in self.dict:
if self.n >= self.capacity:
# 移除双端链表中的第一个节点
remove = self.head.next.key
self.head.next.next.prev = self.head
self.head.next = self.head.next.next
# 删除映射
del self.dict[remove]
self.n -= 1
# 添加新的节点
node = self.Node(key, value)
node.prev = self.tail.prev
node.next = self.tail
self.tail.prev.next = node
self.tail.prev = node
# 添加映射
self.dict[key] = node
self.n += 1
else:
self.dict[key].value = value
self._update(key)