(力扣记录)146. LRU 缓存

(nice!!!)(LeetCode 面试经典 150 题) 146. LRU 缓存 (哈希表+双向链表) 【代码】(nice!!!)(LeetCode 面试经典 150 题) 146. LRU 缓存 (哈希表+双向链表) 阅读详情

数据类型:链表

时间复杂度:O(1)

空间复杂度:O(N)

代码实现:

class Node:

    def __init__(self, key=-1, value=-1):
        self.key = key
        self.val = value
        self.next = None
        self.prev = None

class LRUCache:

    def __init__(self, capacity: int):
        self.map = dict()
        self.cap = capacity
        self.left = Node()
        self.right = Node()
        self.right.prev = self.left
        self.left.next = self.right

    def pop(self, node: Node):
        node.prev.next, node.next.prev = node.next, node.prev

    def push(self, node: Node):
        last = self.right.prev
        last.next = node
        node.prev, node.next = last, self.right
        self.right.prev = node

    def get(self, key: int) -> int:
        if key not in self.map: return -1
        self.pop(self.map[key])
        self.push(self.map[key])
        return self.map[key].val

    def put(self, key: int, value: int) -> None:
        if key in self.map:
            self.pop(self.map[key])
        elif self.cap == len(self.map):
            self.map.pop(self.left.next.key)
            self.pop(self.left.next)
        self.push(Node(key, value))
        self.map[key] = self.right.prev
        


# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)

LeetCode146——LRU缓存机制 我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/lru-cache/description/ 题目描述: 知识点:哈希表、双向链表、LRU缓存机制 思路一:用哈希表记录键值对,用双向链表处理LRU缓存机制 用示例来说明我们算法的流程,为了防止对null节... 阅读详情

相关推荐

【LeetCode 热题100】 146. LRU 缓存的算法思路及python代码

请你设计并实现一个满足缓存 约束的数据结构。实现LRUCachecapacitykeykeyvaluekey-valuecapacity函数get和put必须以O1的平均时间复杂度运行。

pljnb的博客 1330

Leetcode 146.LRU缓存 记录反思

链接 很难,官方提供了两种做法,做完思路还是不明确,所以记录一下深入反思 1.LinkedHashMap 2.hashmap + 双端队列 这道题目的意思可能就是打算让我们封装一个双端队列出来 所以主要记录一下第二种实现方法 从题目要求可以看到 get 和 put 都需要 时间复杂度为 O(1) ,所以可以很简单的想到需要使用 map来实现,然后题干中还有一个要求, 如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。 逐出最长不使用的元素,先想着用队列,但是一般的队列还.

weixin_45935610的博客 227

leetcode 146 LRU 缓存

为了解决移到末尾这个问题,需要使用双向链表来记录,结构大概如下: https://leetcode.cn/problems/lru-cache/solutions/7583/shu-ju-jie-gou-fen-xi-python-ha-xi-shuang-xiang-li/对于链表,遇到上面的情况,也可以在常数的时间内找到对应的节点,但是如果想将它移到队尾则需要从头遍历到该节点才能保证链表不断,对于这种情况需要的时间复杂度也是O(n)// 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}

qq_24030999的博客 1250

Leetcode刷题记录——146.LRU缓存机制

此题难点主要在于 如何用O(1)维护数据更新过的次序 方法为: 设立一个顺序字典 每当更新一个数x的时候 如果这个数没出现过在cache中 则在顺序字典的最后填一个x:1 如果x出现过在cache中 则删除掉字典的x元素的键值对,再到队尾添加上一个x:1 # # @lc app=leetcode.cn id=146 lang=python3 # # [146] LRU缓存机制 # # @lc code=start class LRUCache: def __init__(self, capac.

1996MZH的博客 287

【中等】力扣算法题解析LeetCode146:LRU缓存

本文介绍了一种基于哈希表和双向链表实现的LRU(最近最少使用)缓存机制,能够在O(1)时间复杂度内完成get和put操作。该设计通过维护访问顺序(最近访问节点靠近头部)和哈希快速查找,实现了高效缓存管理。具体实现中,双向链表用于记录访问顺序,哈希表用于快速定位节点。当缓存满时,会自动淘汰链表尾部的节点。文章提供了Java代码实现和详细注释,并解释了核心操作逻辑和辅助方法的功能。

ylumwd的博客 684

CCS安装教程图解说明:可视化步骤快速上手

通过清晰的图解步骤详解CCS安装过程,帮助新手快速掌握环境搭建。结合ccs安装教程与实际操作界面,每一步都直观易懂,大幅降低学习门槛,提升配置效率。

weixin_42611310的博客 963

力扣刷题记录52.1-----146. LRU 缓存

【代码】力扣刷题记录52.1-----146. LRU 缓存。

taiyuezyh的博客 112

AlphaFold2算法详解

正文:https://www.nature.com/articles/s41586-021-03819-2 补充文件:https://static-content.springer.com/esm/art%3A10.1038%2Fs41586-021-03819-2/MediaObjects/41586_2021_3819_MOESM1_ESM.pdfhttps://static-content.springer.com/esm/art%3A10.1038%2Fs41586-021-03819-2/Med

Daisy4的博客 1万+

LeetCode: 146. LRU Cache

LeetCode: 146. LRU Cache 题目描述 Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put. get(key) - Get the value (will alwa...

杨领well的专栏 219

深入博通PEX89000内部:那颗ARM CPU和Synthetic Mode到底能玩出什么花样?

本文深入解析博通PEX89000系列PCIe交换芯片内置的ARM CPU与Synthetic Mode技术,揭示其在AI计算和数据中心的智能潜能。通过ARM Cortex CPU的实时控制和Synthetic Mode的自治网络功能,PEX89000实现了GPU集群的动态拓扑重组和资源池化,大幅提升AI训练效率。文章还探讨了该技术在软件定义数据平面和弹性AI架构中的创新应用。

weixin_30776273的博客 212

Hi3516CV610开发板ISP调优实战——从在线调试到参数固化部署全流程

本文详细介绍了Hi3516CV610开发板ISP参数从在线调试到固化部署的全流程。针对调试参数重启丢失的痛点,重点解析了如何从PQTools安全导出参数、进行格式转换与适配,并通过烧录工具或系统更新两种路径将参数永久固化至Flash。最后提供了双重验证与常见问题排查方法,确保调优效果在产品中稳定生效。

weixin_29169505的博客 426

哈希算法可以记录多大数据_经典缓存淘汰算法LRU剖析:组合数据结构哈希+双向链表解决Leetcode146...

LRU算法全称是Least Recently Used。就是一种缓存淘汰策略。计算机缓存容量有限,需要删除没用的缓存,把有用的继续留在缓存中方便获取,什么是没用的呢?设定为不经常读和写的数据。缓存包括读和写两种操作,我们希望读写速度都很快,也即时间复杂度为O(1)。要达到这个目的,需要设计一种特殊的数据结构,如下图:核心思想:借助哈希实现链表的快速查找,快速查找某个key是否存在于缓存(...

weixin_39824020的博客 79

信捷XD/XL系列PLC与C#通信实战:Modbus-RTU协议详解(附完整代码)

本文详细介绍了信捷XD/XL系列PLC与C#通过Modbus-RTU协议实现高效通信的实战指南。从硬件连接到软件配置,再到核心通信功能的实现与优化,提供了完整的代码示例和工业级应用建议,帮助开发者快速构建稳定的自动化通信系统。

weixin_28292761的博客 511

lc146LRU缓存——模仿LinkedHashMap

要实现O(1)的get和put,那得用哈希表但手撸一个哈希难度太大,应该不至于考那么过分,那就基于使用现有map的前提下实现LRU缓存。关键是要记录最近最少使用的是哪一个,那么需要每次将最新使用的放到“最前面”,这样每次取“最后的”那个就是最近最少使用的。单向链表的话需要知道被移动元素的前一个元素才方便移动,所以最后相比之下双向链表最合适。调用java现有的LinkedHashMap的方法,但不太理解反正都不需要扩容,super(capacity, 1F, true);不行吗,干嘛还弄个装载因子0.75。

qq_61587494的博客 720

040、全志V853低功耗AI视觉平台的ISP调优——电池供电场景下的画质与功耗平衡

本文分享了全志V853 AI视觉平台在电池供电场景下的ISP调优经验。作者通过实际项目踩坑案例,揭示了V853 ISP的特殊性:不同于主流平台,其ISP与CPU共享时钟域,降噪能力有限,需特别注意功耗控制。关键优化策略包括:关闭无效ISP模块、优化Sensor联动时钟、采用场景自适应配置、开发快速启动模式等。特别指出V853个体差异大,量产需考虑高低温影响。文章强调V853的ISP功耗优化需从寄存器级别精打细算,不能简单套用其他平台经验,建议选型时单独评估ISP功耗,避免续航缩水。

zzfmlxs的博客 26

硬件学习手册【总目录】

欢迎大家来到《硬件学习手册》,专栏主要包括 《硬件经验手册》《电子元器件器件手册》《PCB手册》《CPU手册》《元器件选型手册》五个分册。在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 5855

力扣Hot100疑难杂症汇总

这一篇博客主要用来记录中我反复刷,但又反复错的难题,为了防止秋招手撕的时候尬住,写这篇博客记录一下那些容易遗忘而且对我来说难度较大的题目。后面复习的时候重点对着这个名单来刷题。

weixin_52151595的博客 480

15、 深入理解Akka微服务:创建与管理体育博彩平台

本博文深入探讨了如何使用Akka微服务架构为体育博彩平台创建投影和管理事件数据,包括市场投影、投注投影以及数据库投影的实现。同时,介绍了通过gRPC提供HTTP端点以供外部系统访问的方法,并详细说明了在本地环境和Kubernetes中运行应用程序的步骤及配置建议。

weixin_35756624的博客 96

LeetCode打卡Day12

Leetcode腾讯精选练习50题146-LRU缓存机制148-排序链表155-最小栈 146-LRU缓存机制 花了一点时间才把题目看懂,果然还是需要借助例子理解。 官方题解:哈希表+双向链表 148-排序链表 题目很好懂但是不好做嘤嘤嘤 官方题解联系了上一题147-对链表进行插入排序一起看 看完只觉得147和148基本就是同一道题吧 148 = 147 + 排序不能影响链表结构 官方题解中给了“自上而下”和“自下而上”两种顺序的排序方法 155-最小栈 好写!但是我以为getMin()是遍历所有

木得脑袋 261

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

leetCode刷题记录-比较简洁的方法

方法一 //反转一个单链表。 // // 示例: // // 输入: 1->2->3->4->5->NULL //输出: 5->4->3->2->1->NULL // // 进阶: //你可以迭代或递归地反转链表。你能否用两种方法解决这道题? // Related Topics 链表 package leetcode.edi...

qq_24146957的博客 402

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCodeGOGOGO刷题记01——链表优化(哈希法实现按键值访问链表)

deadline是第一生产力,刚刚收到笔试通知的我到现在居然一道题还没来得及刷,赶紧开始LeetCode刷题记 从回忆版的题入手,据说是今年amazon电面的题,have a try 206.Reverse Linked List 难度: Easy 思路: 就是个简单链表反转的水题,注意输入可能是空链表这种特殊情况 代码: /* Author Owen_Q */ /** ...

Owen_Q的博客 372

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

学习日记day50

总结与心得:专注时长很可以。周六周日懈怠+休息了。《146.LRU缓存》是高频手撕面试题。看了《模式识别与机器学习》历年试卷,感觉不去上课,不改学习方法会挂科啊【GitHub repo并且学习的ML等算法都要去做笔记手敲,这样才好复习,而且也才是真正学进去,不然又忘记了。】以后每次课都去,晚上下课后再去练,练完就不做有氧了。买个笔记本电脑充电宝吧。专注时间:5H55min。《146.LRU缓存》

illuosion7的博客 288

力扣146.LRU缓存

实现一块大小为capacity的内存,并实现存入键值对,更新值和内存的功能

2301_80505422的博客 1357

【图解版】力扣第146题:LRU缓存

【图解版】力扣146题:LRU缓存,看不懂来找我!!!

cool-wangtongzhou 1894

力扣146LRU缓存

找到对应节点之后要将其移动到最前面,那这就意味着我们需要知道第二个节点的指针,这有点麻烦,因为第二个节点可能会变化。并且,每个节点要存储key/value/next/prev,因为找到尾节点之后还要返回它的key值,这样才能从哈希表中删除。但是问题又来了:如果我们把中间的元素移到了上面,那空出来的位置要补上,这就意味着必然要进行移动操作,那时间复杂度肯定不是O(n)了。因为在链表中删除元素是O(1)操作,不涉及补位,也没有预分配空间的问题。// 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}

Kevincxt的博客 1033

【LeetCode】【算法】146. LRU缓存

LeetCode 146. LRU缓存

passer__jw767的博客 1401
上一篇: 【附完整项目代码】从一个社交分享平台入门MERN全栈开发
下一篇: (力扣记录)39. 组合总和
Wilson_ZheLIN
博客等级 码龄5年 684粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值