news 2026/10/13 13:47:51

【LeetCode刷题】LRU缓存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LeetCode刷题】LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。

实现LRUCache类:

  • LRUCache(int capacity)以正整数作为容量capacity初始化 LRU 缓存
  • int get(int key)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。
  • void put(int key, int value)如果关键字key已经存在,则变更其数据值value;如果不存在,则向缓存中插入该组key-value。如果插入操作导致关键字数量超过capacity,则应该逐出最久未使用的关键字。

函数get和put必须以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]解释LRUCache lRUCache = new LRUCache(2); lRUCache.put(1, 1); // 缓存是 {1=1} lRUCache.put(2, 2); // 缓存是 {1=1, 2=2} lRUCache.get(1); // 返回 1 lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3} lRUCache.get(2); // 返回 -1 (未找到) lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3} lRUCache.get(1); // 返回 -1 (未找到) lRUCache.get(3); // 返回 3 lRUCache.get(4); // 返回 4

提示:

  • 1 <= capacity <= 3000
  • 0 <= key <= 10000
  • 0 <= value <=
  • 最多调用2 * 105次get和put

解题思路

  1. 数据结构选择:OrderedDict既保留了哈希表的 O (1) 查找特性,又维护了元素的插入顺序,通过move_to_end和popitem可以在 O (1) 时间内完成「标记最近使用」和「淘汰最久未使用」的操作。
  2. get操作:
    • 若 key 不存在,直接返回-1。
    • 若 key 存在,将其移动到字典末尾(标记为「最近使用」),再返回对应值。
  3. put操作:
    • 若 key 已存在,更新值并移动到末尾(标记为「最近使用」)。
    • 若 key 不存在,直接添加到末尾。
    • 若添加后超出容量,删除字典头部的元素(最久未使用的键)。

复杂度分析

  • 时间复杂度:get和put操作均为O(1),因为OrderedDict的move_to_end、popitem和哈希表的增删改查都是 O (1) 时间。
  • 空间复杂度:O(capacity),最多存储capacity个键值对。

Python代码

from collections import OrderedDict class LRUCache: def __init__(self, capacity: int): self.cache = OrderedDict() self.capacity = capacity def get(self, key: int) -> int: if key not in self.cache: return -1 # 将访问的键移到末尾,表示最近使用 self.cache.move_to_end(key) return self.cache[key] def put(self, key: int, value: int) -> None: if key in self.cache: # 键已存在,更新值并移到末尾 self.cache.move_to_end(key) self.cache[key] = value # 检查容量,超出则删除最久未使用的键(头部元素) if len(self.cache) > self.capacity: self.cache.popitem(last=False) # ------------------------------ 测试驱动代码 ------------------------------ def run_operations(ops, params): """ 执行操作序列,返回每个操作的结果 :param ops: 操作类型列表(如["LRUCache", "put", "get"]) :param params: 对应每个操作的参数列表 :return: 操作结果列表,与题目输出格式一致 """ obj = None result = [] for op, param in zip(ops, params): if op == "LRUCache": obj = LRUCache(*param) result.append(None) elif op == "get": res = obj.get(*param) result.append(res) elif op == "put": obj.put(*param) result.append(None) return result # 题目示例输入 if __name__ == "__main__": ops = ["LRUCache","put","put","get","put","get","put","get","get","get"] params = [[2],[1,1],[2,2],[1],[3,3],[2],[4,4],[1],[3],[4]] # 执行并打印结果 output = run_operations(ops, params) print("输出结果:", output) # 验证是否与题目输出一致 expected = [None, None, None, 1, None, -1, None, -1, 3, 4] print("是否符合预期:", output == expected)

LeetCode提交代码

class LRUCache: def __init__(self, capacity: int): self.cache = OrderedDict() self.capacity = capacity def get(self, key: int) -> int: if key not in self.cache: return -1 # 将访问的键移到末尾,表示最近使用 self.cache.move_to_end(key) return self.cache[key] def put(self, key: int, value: int) -> None: if key in self.cache: # 键已存在,更新值并移到末尾 self.cache.move_to_end(key) self.cache[key] = value # 检查容量,超出则删除最久未使用的键(头部元素) if len(self.cache) > self.capacity: self.cache.popitem(last=False) # Your LRUCache object will be instantiated and called as such: # obj = LRUCache(capacity) # param_1 = obj.get(key) # obj.put(key,value)

程序运行截图展示

总结

本文介绍了LRU缓存机制的实现方法。通过使用Python的OrderedDict数据结构,既保证了O(1)时间复杂度的查找操作,又维护了元素的访问顺序。当缓存容量超出时,自动淘汰最久未使用的元素。该实现满足题目要求的get和put操作均为O(1)时间复杂度,并通过测试用例验证了正确性。关键点在于利用OrderedDict的move_to_end和popitem方法高效处理最近访问标记和元素淘汰。

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

基于Springboot+Vue的林业资源管理系统源码文档部署文档代码讲解等

课题介绍本课题旨在设计并实现一款基于SpringBootVue前后端分离架构的林业资源管理系统&#xff0c;聚焦林业部门日常管控、资源监测、数据统计核心需求&#xff0c;构建集资源档案管理、实时监测、数据分析、权限管控于一体的智能化管理平台。系统采用SpringBoot 2.7.x作为后端…

作者头像 李华
网站建设 2026/10/12 12:55:23

redis源码deps目录

文章目录 fast-floatfpconvhdr_histogramhiredisjemalloclinenoiselua REDIS源码里deps目录是做什么的&#xff1f;从阅读deps目录&#xff0c;我们可以感觉到redis&#xff0c;真的是对性能的追求达到了极致&#xff0c;尽一切可能去优化性能。 deps主要存放的是依赖的第三方库…

作者头像 李华
网站建设 2026/10/9 4:11:00

小程序毕设选题推荐:微信小程序的个人运动健康管理平台基于SpringBoot+Vue的个人运动健康小程序的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/9 21:20:36

【Vue知识点总结】API封装全指南:参数类型、场景选择与企业实战

一、API 封装的核心价值 在企业级 Vue 项目中,API 封装不仅是为了代码整洁,更是为了: 统一接口管理:集中维护所有后端接口地址 参数标准化:规范请求/响应数据格式 错误处理:统一拦截异常和状态码 提高复用性:减少重复代码 便于测试:模块化接口更易mock和测试 二、API …

作者头像 李华
网站建设 2026/10/10 9:01:02

全球股市估值与基因治疗的医疗保险政策框架

全球股市估值与基因治疗的医疗保险政策框架 关键词:全球股市估值、基因治疗、医疗保险政策、金融与医疗融合、投资分析 摘要:本文深入探讨了全球股市估值与基因治疗的医疗保险政策框架之间的关系。首先介绍了研究的背景、目的、预期读者等内容。接着阐述了全球股市估值和基因…

作者头像 李华
网站建设 2026/10/9 21:23:08

Claude:开启AI原生应用领域新时代

Claude与AI原生应用&#xff1a;从工具革命到生态重构 关键词 Claude、AI原生应用、Constitutional AI、长上下文处理、生成式AI、prompt工程、安全可控性 摘要 当我们谈论"AI原生应用"时&#xff0c;我们究竟在谈论什么&#xff1f;是将ChatGPT嵌入App的"A…

作者头像 李华