LeetCode146题:LRU缓存(python3)

代码思路:

Python 默认是用 dict 存储属性的,每次用 . 访问属性都需要查字典。如果声明 slots 就不会创建字典,而是改用指针偏移量直接拿到属性对象。所以即节省了内存(没有字典)又节省了时间(省去查字典的过程)。

python 复制代码
class Node:
    __slots__ = 'prev','next','key','value'

    def __init__(self,key=0,value=0):
        self.key = key
        self.value = value
    


class LRUCache:

    def __init__(self, capacity: int):
        self.capacity = capacity
        self.dummy = Node()
        self.dummy.prev = self.dummy
        self.dummy.next = self.dummy
        self.key_to_node = dict()
    
    def get_node(self,key:int) -> Optional[Node]:
        if key not in self.key_to_node: #没有的话
            return None
        node = self.key_to_node[key] #有
        self.remove(node)
        self.push_front(node) #放到最前面
        return node


    def get(self, key: int) -> int:
        node = self.get_node(key)
        return node.value if node else -1


    def put(self, key: int, value: int) -> None:
        node = self.get_node(key)
        if node:
            node.value = value #更新value
            return
        self.key_to_node[key] = node = Node(key,value)
        self.push_front(node)
        if len(self.key_to_node) > self.capacity:
            back_node = self.dummy.prev
            del self.key_to_node[back_node.key]
            self.remove(back_node)
    
    def remove(self, x:Node) -> None:
        x.prev.next = x.next
        x.next.prev = x.prev

    def push_front(self, x:Node) -> None:
        x.prev = self.dummy
        x.next = self.dummy.next
        x.prev.next = x
        x.next.prev = x
相关推荐
风早爽太8 分钟前
Python 学习笔记:SQLModel 使用外键关联查询数据
python·fastapi·sqlmodel
专业程序开发源9 分钟前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
Dovis(誓平步青云)35 分钟前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
在世修行43 分钟前
干货:左右分栏调试工具设计
python·调试设计
hweiyu001 小时前
Redis命令:HTTL
redis·缓存
h_a_o777oah1 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO91 小时前
指针的算术运算详解
java·数据结构·算法
sunshine22 girl1 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习
Coder-magician1 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
零基础1231 小时前
DeepSeek V4.1 Flash (Batch) 的性能测试与应用
经验分享·python·语言模型·vllm