Leetcode 146. LRU 缓存

注意的点:

1、这道题本质是要求一个可以排序的字典(因为O(1)的时间复杂度就是字典),所以要不就用collections自带的OrderDict,要不然就用字典加双头链表自己实现一个。

2、OrderedDict的两个方法:

.move_to_end(key, last=False):把元素后移一位,last=True的话就是移动到最后

.popitem(last=True):把最后位置的元素pop出去

解法一:python的OrderDict

python 复制代码
from collections import OrderedDict

class LRUCache:
    def __init__(self, capacity: int):
        self.capacity = capacity
        self.cache = OrderedDict()

    def get(self, key: int) -> int:
        if key in self.cache:
            self.cache.move_to_end(key, last=False)
            return self.cache[key]
        else:
            return -1

    def put(self, key: int, value: int) -> None:
        self.cache[key] = value
        self.cache.move_to_end(key, last=False)
        if len(self.cache) > self.capacity:
            self.cache.popitem(last=True)
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)

解法二:字典加双链表

python 复制代码
class LRUCache:

    def __init__(self, capacity: int):
    
        self.max = capacity
        self.store = dict()  
        self.head = Linknode(None, None)
        self.tail = self.head

    def get(self, key: int) -> int:
        if key not in self.store.keys():
            return -1
        
        self.addcurrentnode2tail(key)
        return self.store[key]
      

    def put(self, key: int, value: int) -> None:
        if key not in self.store.keys():
            node = Linknode(None, key)
            self.tail.next = node
            # self.tail = self.tail.next
            self.tail = node
            if len(self.store.keys()) == self.max:
                tempnode = self.head.next
                removed_key = tempnode.val
                self.head.next = tempnode.next
                tempnode.next = None
                self.store.pop(removed_key)
            self.store[key] = value
        else:  # 找到这个
            self.addcurrentnode2tail(key)
            self.store[key] = value
    
    def addcurrentnode2tail(self, akey):
        print(889, self.head)
        hi = self.head
        while hi.next:
            if hi.next.val == akey:
                break
            hi = hi.next
        # 把hi移动到链表的尾部(可能已经是末尾了)
        if hi.next.next:
            temp = hi.next.next
            hi.next.next = None
            self.tail.next = hi.next
            hi.next = temp
            self.tail = self.tail.next
      
class Linknode:
    def __init__(self, ne=None, val=None):
        self.next = ne
        self.val = val
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)
相关推荐
wangbing1125几秒前
redis的存储问题
数据库·redis·缓存
AI科技星4 分钟前
统一场论变化的引力场产生电磁场推导与物理诠释
服务器·人工智能·科技·线性代数·算法·重构·生活
杰克逊的日记6 分钟前
规控算法(规划 + 控制算法)
大数据·算法·云计算·it
玉树临风ives7 分钟前
atcoder ABC439 题解
c++·算法
这周也會开心13 分钟前
JVM-垃圾回收算法
jvm·算法
学编程就要猛15 分钟前
算法:4.长度最小的子数组
算法
红豆诗人24 分钟前
算法和数据结构--时间复杂度和空间复杂度
数据结构·算法
高山上有一只小老虎31 分钟前
小红的字符串
java·算法
2501_9418108332 分钟前
在班加罗尔智慧教育场景中构建在线学习实时监控与高并发课程管理平台的工程设计实践经验分享
算法
星火开发设计37 分钟前
折半插入排序原理与C++实现详解
java·数据结构·c++·学习·算法·排序算法·知识