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

力扣刷题Day 37:LRU 缓存(146)

1.题目描述

2.思路

方法1:直接用Python封装好的数据结构OrderedDict(兼具哈希表与双向链表的数据结构)。

方法2:哈希表辅以双向链表。

3.代码(Python3)

方法1:

class LRUCache(collections.OrderedDict):def __init__(self, capacity: int):super().__init__()self.capacity = capacitydef get(self, key: int) -> int:if key not in self:return -1self.move_to_end(key)return self[key]def put(self, key: int, value: int) -> None:if key in self:self.move_to_end(key)self[key] = valueif len(self) > self.capacity:self.popitem(last=False)

方法2:

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.move_to_head(node)return node.valuedef put(self, key: int, value: int) -> None:print(self.size, self.capacity)if key not in self.cache:node = DLinkedNode(key, value)self.cache[key] = nodeself.add_to_head(node)self.size += 1if self.size > self.capacity:removed = self.remove_tail()self.cache.pop(removed.key)self.size -= 1else:node = self.cache[key]node.value = valueself.move_to_head(node)def add_to_head(self, node):node.prev = self.headnode.next = self.head.nextself.head.next.prev = nodeself.head.next = nodedef remove_node(self, node):node.prev.next = node.nextnode.next.prev = node.prevdef move_to_head(self, node):self.remove_node(node)self.add_to_head(node)def remove_tail(self):node = self.tail.prevself.remove_node(node)return node

4.执行情况

方法1:

方法2:

5.感想

这两个方法都是官方题解给的,我第一次接触这种LRU的题,没能想出来解决办法。

相关文章:

  • 双线性配对
  • 从创意到变现:独立创造者的破局之路——解码《Make:独立创造者手册》
  • NetBox Docker 全功能部署方案(Ubuntu 22.04 + Docker)
  • 发行基础:Epic平台上传流程
  • ESP32蓝牙开发笔记(十四)
  • 民宿管理系统6
  • 第3章 模拟法
  • 遥感数据处理、机器学习建模与空间预测的全流程指南——涵盖R语言(随机森林、XGBoost、SVM等)、特征提取、模型优化及生态学案例分析
  • 3、食品包装控制系统 - /自动化与控制组件/food-packaging-control
  • 162558-52-3,MCLA的化学发光是一种的超氧化物检测手段
  • Hadoop客户端环境准备
  • 【大模型面试每日一题】Day 11:参数高效微调方法(如LoRA、Adapter)的核心思想是什么?相比全参数微调有何优缺点?
  • OpenCV 中用于背景分割的一个类cv::bgsegm::BackgroundSubtractorGMG
  • FFmpeg(7.1版本)编译生成ffplay
  • Linux 系统命令使用指南1
  • 项目文档归档的最佳实践有哪些?
  • 数字电子技术基础(五十五)——D触发器
  • 微信小程序预览文件 兼容性苹果
  • 【C++】类和对象(下)
  • 桥接模式(Bridge)
  • 欧洲承诺投资6亿欧元吸引外国科学家
  • 北上广深均宣布下调个人住房公积金贷款利率
  • 国家主席习近平同普京总统举行小范围会谈
  • 光大华夏:近代中国私立大学遥不可及的梦想
  • 马上评|持续对标国际一流,才有22项“全球最优”
  • 潘功胜:降准0.5个百分点,降低政策利率0.1个百分点