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

【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) 的平均时间复杂度运行。

解题思路

看的题解,双向链表+哈希表+假链表头尾

AC代码

class DLinkedNode:def __init__(self, key=0, value=0):self.key = keyself.value = valueself.prev = Noneself.next = Noneclass LRUCache:def __init__(self, capacity: int):self.cache = dict()# 使用伪头部和伪尾部节点    self.head = DLinkedNode()self.tail = DLinkedNode()self.head.next = self.tailself.tail.prev = self.headself.capacity = capacityself.size = 0def get(self, key: int) -> int:if key not in self.cache:return -1node = self.cache[key]self.moveToHead(node)return node.valuedef put(self, key: int, value: int) -> None:if key not in self.cache:# 如果 key 不存在,创建一个新的节点node = DLinkedNode(key, value)# 添加进哈希表self.cache[key] = node# 添加至双向链表的头部self.addToHead(node)self.size += 1if self.size > self.capacity:# 如果超出容量,删除双向链表的尾部节点removed = self.removeTail()# 删除哈希表中对应的项self.cache.pop(removed.key)self.size -= 1else:# 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部node = self.cache[key]node.value = valueself.moveToHead(node)def addToHead(self, node):node.next = self.head.nextnode.prev = self.headself.head.next.prev = nodeself.head.next = nodedef removedNode(self, node):node.prev.next = node.nextnode.next.prev = node.prevdef moveToHead(self, node):self.removedNode(node)self.addToHead(node)def removeTail(self):node = self.tail.prevself.removedNode(node)return node# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)
http://www.lryc.cn/news/383665.html

相关文章:

  • 记录一个Xshell使用中Xmanager...X11转发的提示问题
  • Mamba 模型
  • 30-33、SpringBoot项目部署\属性配置方式\多环境开发(一个文件)\多环境分组(多个文件)
  • 【PyQt5】一文向您详细介绍 setContentsMargins() 的作用
  • 分页查询前端对接
  • 从一万英尺外看libevent(源码刨析)
  • Linux部署SVN
  • Linux高并发服务器开发(二)系统调用函数
  • rk3568 Android 11在系统怎样执行命令获取SN号
  • PostgreSQL 性能优化与调优(六)
  • win10 安装openssl并使用openssl创建自签名证书
  • 【OpenCV 图像处理 Python版】图像处理的基本操作
  • HarmonyOS应用开发学习经验
  • LLM大语言模型应用方案之RAG检索增强生成的实现步骤。
  • 【python学习】学习python的小项目
  • java-冒泡排序 1
  • 【STM32】USART串口通讯
  • Qt6中如何将QList转为QSet?
  • aspectj:AOP编程备忘录-切面定义的注意事项
  • 大数据面试题之Hive(1)
  • 【Git】分布式版本控制工具
  • 排序之插入排序----直接插入排序和希尔排序(1)
  • 快速创建条形热力图
  • go switch 与 interface
  • BaseMapper 接口介绍
  • HAL-Cubemax定时器使用记录
  • 同时使用磁吸充电器和Lightning时,iPhone充电速度会变快吗?
  • 零成本搭建个人图床服务器
  • SpringBoot 搭建sftp服务 实现远程上传和下载文件
  • IDEA中使用leetcode 刷题