news 2026/10/4 10:47:00

DeepSeek LeetCode 146. LRU 缓存 Python3实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 146. LRU 缓存 Python3实现

LeetCode 146. LRU 缓存 - Python3 实现

题目要求

设计一个满足 LRU(最近最少使用) 策略的缓存类:

· get(key):如果 key 存在,返回 value,否则返回 -1。
· put(key, value):如果 key 存在,更新 value;如果不存在,插入。若超出容量,则删除最久未使用的 key。
· 要求 get 和 put 时间复杂度均为 O(1)。


方法一:使用 OrderedDict(简洁版)

Python 的 collections.OrderedDict 天然支持按插入顺序排列,并提供了 move_to_end 和 popitem(last=False) 方法,非常适合实现 LRU。

fromcollectionsimportOrderedDictclassLRUCache:def__init__(self,capacity:int):self.capacity=capacity self.cache=OrderedDict()defget(self,key:int)->int:ifkeynotinself.cache:return-1# 将访问过的 key 移到末尾(表示最近使用)self.cache.move_to_end(key)returnself.cache[key]defput(self,key:int,value:int)->None:ifkeyinself.cache:# 已存在,先移到末尾再更新值self.cache.move_to_end(key)self.cache[key]=value# 超出容量,删除最久未使用的(即字典开头的元素)iflen(self.cache)>self.capacity:self.cache.popitem(last=False)

方法二:哈希表 + 双向链表(面试推荐手写)

为了彻底理解 LRU 的底层原理,建议手写一个双向链表 + 字典的实现。

classNode:__slots__=('key','value','prev','next')def__init__(self,key=0,value=0):self.key=key self.value=value self.prev=Noneself.next=NoneclassLRUCache:def__init__(self,capacity:int):self.capacity=capacity self.cache={}# key -> Nodeself.size=0# 使用伪头尾节点,方便操作self.head=Node()self.tail=Node()self.head.next=self.tail self.tail.prev=self.headdef_add_to_head(self,node:Node)->None:"""将节点添加到头部(最近使用)"""node.prev=self.head node.next=self.head.nextself.head.next.prev=node self.head.next=nodedef_remove_node(self,node:Node)->None:"""从链表中移除节点"""node.prev.next=node.nextnode.next.prev=node.prevdef_move_to_head(self,node:Node)->None:"""将节点移动到头部"""self._remove_node(node)self._add_to_head(node)def_remove_tail(self)->Node:"""移除尾部节点(最久未使用)并返回"""node=self.tail.prev self._remove_node(node)returnnodedefget(self,key:int)->int:ifkeynotinself.cache:return-1node=self.cache[key]self._move_to_head(node)returnnode.valuedefput(self,key:int,value:int)->None:ifkeyinself.cache:node=self.cache[key]node.value=value self._move_to_head(node)else:node=Node(key,value)self.cache[key]=node self._add_to_head(node)self.size+=1ifself.size>self.capacity:removed=self._remove_tail()delself.cache[removed.key]self.size-=1

复杂度分析

操作 时间复杂度 空间复杂度
get O(1) O(capacity)
put O(1) O(capacity)

· 哈希表保证查找 O(1)。
· 双向链表保证插入、删除、移动节点 O(1)。


测试示例

# 输入:# ["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]# [[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]# 预期输出:# [null, null, null, 1, null, -1, null, -1, 3, 4]lru=LRUCache(2)lru.put(1,1)lru.put(2,2)print(lru.get(1))# 返回 1lru.put(3,3)# 该操作会使得 key 2 被淘汰print(lru.get(2))# 返回 -1lru.put(4,4)# 该操作会使得 key 1 被淘汰print(lru.get(1))# 返回 -1print(lru.get(3))# 返回 3print(lru.get(4))# 返回 4

以上两种实现均可通过 LeetCode 146,方法一代码简洁,方法二更能体现 LRU 的设计思想。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 8:46:45

数制之间的转换

一、介绍任何计算机识别的信息必须要转换成0、1的数据形式,能够让能进行算术运算的数值信息变成计算机数值数据,其余信息成为非数值数据。为了方便数据存储,我们把数据按照使用习惯以进制的方式进行划分。然后我们把进制也叫做进制位&#xf…

作者头像 李华
网站建设 2026/10/3 8:45:49

LVGL 面试实战:样式层叠继承规则

一、场景引入 在实际 LVGL 项目开发中,当你需要给整屏的按钮统一设置圆角、字体,又要给个别特殊按钮单独修改颜色时,经常会遇到样式不生效、继承结果不符合预期的问题,本质都是对 LVGL 的样式层叠、继承规则理解不到位。这是 LVGL 界面开发的核心基础,也是面试中高频考察…

作者头像 李华
网站建设 2026/10/3 8:45:16

多媒体应用30-913(补)

ISO/OSI 标准化组织的英文简称____。 → ISO。重点:国际标准化组织;IEC 电工委员会。我国国家标准代号 GB 表示____标准。 → 强制性。重点:GB/T 推荐性;GB/Z 指导性。标准的四级:国家、行业、地方、____标准。 → 企业…

作者头像 李华
网站建设 2026/10/3 8:42:41

DeepSeek-Agent-Harness-2026终极指南-第10章第49节-安全与权限-安全防线大阅兵:v0.5里程碑与30项自测清单

DeepSeek Agent Harness 2026终极指南 - 第10章第49节 安全防线大阅兵:v0.5里程碑与30项自测清单 第46-48节分别做了三级审批、沙箱执行、路径白名单三道防线。但每道防线单独看容易有漏洞,需要整体验收。这节做安全防线大阅兵:把三道防线串成…

作者头像 李华
网站建设 2026/10/3 8:40:00

【2027最新精品大数据】基于大数据的全国各地景点指数数据可视化分析,附源码_高质量项目_可视化_数据分析_毕设选题推荐_SPark_Hadoop_毕设指导

💖💖作者:计算机毕业设计杰瑞 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括…

作者头像 李华