当前位置: 首页 > news >正文

力扣146LRU缓存

请你设计并实现一个满足 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) 的平均时间复杂度运行。

classListNode:def__init__(self,key=0,value=0):self.key=key self.value=value self.prev=Noneself.next=NoneclassLRUCache(object):def__init__(self,capacity):self.capacity=capacity self.cache={}self.head=ListNode()self.tail=ListNode()self.head.next=self.tail self.tail.prev=self.headdef_remove_node(self,node):node.prev.next=node.nextnode.next.prev=node.prevdef_add_to_head(self,node):node.prev=self.head node.next=self.head.nextself.head.next.prev=node self.head.next=nodedef_move_to_head(self,node):self._remove_node(node)self._add_to_head(node)def_pop_tail(self):node=self.tail.prev self._remove_node(node)returnnode.keydefget(self,key):ifkeynotinself.cache:return-1node=self.cache[key]self._move_to_head(node)returnnode.valuedefput(self,key,value):ifkeyinself.cache:node=self.cache[key]node.value=value self._move_to_head(node)else:new_node=ListNode(key,value)self.cache[key]=new_node self._add_to_head(new_node)iflen(self.cache)>self.capacity:tail_key=self._pop_tail()delself.cache[tail_key]

这个题要求put和get函数时间复杂度为O(1),所以我们需要可以选双端链表+哈希表。
首先定义一些双端链表的实现方法,新增链表节点到头节点,删除链表节点,把链表节点移到头节点,删除链表尾节点。
get函数是提取哈希表中的值,如果不存在,就返回-1,提取完之后,把这个节点移动到链表头。
put函数是把节点放到哈希表中,如果key已经存在,就是改值,改完之后把这个节点移动到链表头,如果key不存在,就添加,然后这个节点移动到链表头,但是如果超过哈希表的容量了,就要删除链表的尾节点。

http://www.jsqmd.com/news/1091690/

相关文章:

  • 自动点击器下载安装教程【超详细】安卓连点器保姆级图文教程(附安装包)
  • 我为什么研究RAGFlow:RuyiBookCourse遇到复杂文档解析后必须想清楚的事
  • 免费解锁WeMod专业版:Wand-Enhancer完全使用指南
  • 3min手搓一个帮助文档,很合理吧!
  • Simcenter STAR-CCM+安装步骤(附安装包)STAR-CCM+ 超详细下载安装教程
  • libuvc实战:跨平台USB摄像头控制与多设备区分
  • 如何深度掌控AMD Ryzen处理器:SMU Debug Tool完整指南
  • 人工智能大模型兵棋推演系统软件平台:有哪些优点和缺点
  • 先说个常见的情况
  • BurpSuite 2023+ 上游代理配置实战:告别UserOptions,拥抱Settings新路径
  • NFS服务安全加固:从CVE-1999-0554漏洞看showmount信息泄露的深度防御
  • 射频工程师实战指南:S参数、OP1dB、IMD与NF的测量要点与校准技巧
  • 如何在 Python 项目中避免循环引用
  • 关于防范利用非主流二级域名进行钓鱼攻击的风险提示
  • SetDPI深度解析:Windows DPI缩放管理的命令行艺术
  • FPGA I/O Bank选型指南:HP、HR、HD三大Bank特性与应用场景全解析
  • 【Claude】Claude Code 企业/团队环境完整配置指南
  • 如何用Revelation光影包打造电影级Minecraft体验:完整安装与配置指南
  • 告别手动对齐:用MathType在Word中高效管理公式编号与引用
  • Python自动化AutoCAD:从重复劳动到智能设计的革命性跨越
  • Nmap从入门到精通:主机发现、端口扫描与安全审计实战指南
  • GHelper完整攻略:华硕ROG笔记本性能控制终极指南
  • ChatGPT Plus额度限制真相:不是按月固定,而是基于RLHF反馈权重的动态滑动窗口(附Python额度预测模型代码)
  • 深入解析MSPM0 DEBUGSS调试子系统:从架构原理到安全功耗实战
  • eNSP模拟器环境搭建:从VirtualBox到Wireshark的完整依赖链部署指南
  • TypeScript的keyof typeof组合:从对象推导出键名联合类型
  • 你熟悉多线程,请举例说明你在项目中如何正确使用线程池,以及遇到过哪些线程安全问题?
  • Spring Boot 虚拟线程实战:ThreadLocal 串数据、连接池打爆、synchronized 钉住线程,三个坑及解决方案
  • 终极指南:3大核心功能让原神日常任务效率翻倍
  • Win11Debloat:让Windows 11重获新生的终极优化工具