LeetCode LRU缓存

Leetcode LRU缓存 为了实现这一目标,我们使用。这样,我们就高效地实现了。成为最近使用的数据。 阅读详情

题目地址:https://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&envId=top-100-liked

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

// 把 哈希表(map) 和 双向链表(doubly linked list) 结合:
// map 用于用键快速定位缓存节点(O(1)查找)。
// 双向链表维护使用顺序,链表头表示最近使用(MRU),链表尾表示最久未使用(LRU)。当容量超出时,从尾部删除节点并同时从 map 中移除。

type LRUCache struct {
	size     int
	capacity int
	cache    map[int]*DLinkedNode
	head     *DLinkedNode
	tail     *DLinkedNode
}

type DLinkedNode struct {
	key, val   int
	prev, next *DLinkedNode
}

func initDLinkedNode(key, val int) *DLinkedNode {
	return &DLinkedNode{key: key, val: val}
}

func Constructor(capacity int) LRUCache {
	lru := &LRUCache{
		size:     0,
		capacity: capacity,
		cache:    make(map[int]*DLinkedNode, capacity),
		head:     new(DLinkedNode),
		tail:     new(DLinkedNode),
	}
	lru.head.next = lru.tail
	lru.tail.prev = lru.head
	return *lru
}

// 在 map 中查找节点:
// 未命中:返回 -1(或指定的“未找到”值)
// 命中:返回值前,必须把该节点 移动到链表头部(标记为最近使用)
// 移动步骤(moveToHead):removeNode(node) —— 将 node 从当前位置断开(调整前后节点指针)addToHead(node) —— 将 node 插入到 head 后面
func (this *LRUCache) Get(key int) int {
	node := this.cache[key]
	if node != nil {
		this.moveToHead(node)
		return node.val
	}
	return -1
}

// 在 map 中查找是否已有该 key:若存在:更新 node.value;然后 moveToHead(node)
// 若不存在:构造新节点 node(key,value) addToHead(node) map[key] = node

// 如果 size == capacity,
// 则需要 evict:removed := removeTail() (取得 tail.prev)delete(map, removed.key)
// removeTail():取 tail.prev(真实尾节点),执行 removeNode(removed) 并返回 removed
func (this *LRUCache) Put(key int, value int) {
	node := this.cache[key]
	if node != nil {
		node.val = value
		this.cache[key] = node
		this.moveToHead(node)
		return
	}
	node = &DLinkedNode{key: key, val: value}
	if this.size == this.capacity {
		removed := this.removeTail()
		delete(this.cache, removed.key)
		this.size--
	}
	this.addToHead(node)
	this.size++
	this.cache[key] = node

}

// 对 双向链表的操作
func (lru *LRUCache) addToHead(node *DLinkedNode) {
	node.next = lru.head.next
	lru.head.next.prev = node
	lru.head.next = node
	node.prev = lru.head
}

func (lru *LRUCache) removeNode(node *DLinkedNode) {
	preNode := node.prev
	preNode.next = node.next
	node.next.prev = preNode
}

func (lru *LRUCache) moveToHead(node *DLinkedNode) {
	lru.removeNode(node)
	lru.addToHead(node)
}

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

相关推荐

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的博客 1249

146. LRU 缓存【 力扣(LeetCode) 】

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

yyh520025的博客 2780

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

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

ylumwd的博客 684

力扣146:LRU缓存

LRU缓存(Least Recently Used Cache)是一种常见的缓存淘汰策略,用于在缓存空间不足时决定移除哪些数据。优先淘汰最近最少使用的数据,保留最近频繁访问的数据。举个例子:安卓手机都可以把软件放到后台运行,比如我先后打开了「设置」「手机管家」「日历」,那么现在他们在后台排列的顺序是这样的:但是这时候如果我访问了一下「设置」界面,那么「设置」就会被提前到第一个,变成这样:假设我的手机只允许我同时开 3 个应用程序,现在已经满了。

yk_18的博客 754

COMSOL电弧放电仿真:四场耦合与磁流体建模实战指南

多物理场耦合仿真是现代工程中模拟复杂物理过程的重要手段。电弧本质上是电场、磁场、流场与温度场四场相互耦合的非线性系统,其行为由磁流体力学(MHD)方程描述。通过COMSOL等工具构建电弧模型,可准确预测温度分布、流场结构和电极烧蚀,为开关电器设计、等离子体应用等提供数据支撑。在高压电器开断、电弧切割、激光打孔等工程问题中,高效求解MHD耦合模型是关键。然而,电弧仿真涉及物性参数强非线性、边界条件设置、求解器配置以及移动网格处理等挑战。以二维轴对称电弧模型为例,系统梳理磁流体方程落地、多物理场耦合节点配置、收

weixin_30047059的博客 134

新手必看:如何用PhaGCN2和vConTACT2搞定宏病毒组注释(附避坑指南)

本文为宏病毒组研究新手提供了使用PhaGCN2和vConTACT2进行病毒注释的完整实战指南。内容涵盖从Conda环境配置、软件安装、参数解析到结果解读的全流程,并重点分享了整合双工具进行交叉验证的策略与常见报错解决方案,旨在帮助研究者高效、准确地完成病毒分类注释工作。

j2k3l4的博客 795

LeetCode hot 力扣100 LRU 缓存

并且给出了一个输入序列和期望的输出序列。•使用哈希表快速定位key在链表中的位置,从而高效实现get和put操作。•缓存状态:[(2,2),(1,1)](最近使用的在前,容量已满)。•通过idx[key]快速定位到链表中的元素,将其移动到链表头部。•使用链表维护元素的使用顺序,头部是最近使用的,尾部是最久未使用的。•缓存状态:[(1,1)](最近使用的在前,容量未满)。•将键1移动到链表头部,表示它是最近使用的。•将键3移动到链表头部,表示它是最近使用的。

qq_51956059的博客 2120

《解锁GCC版本选择的奥秘:从入门到精通》

GCC 版本的选择是一项复杂而关键的决策,犹如一场精心策划的战略布局,贯穿于软件开发的整个生命周期。从项目需求与兼容性的深度考量,到性能与稳定性的权衡抉择,再到硬件与系统适配的精准对接,每一个环节都紧密相连,相互影响。在游戏开发行业,对性能的极致追求促使开发者青睐较新的 GCC 版本,以实现更流畅的游戏体验和更震撼的视觉效果;科学计算领域则依赖于 GCC 版本对复杂数学运算的高效优化,以应对大规模数据处理的挑战;嵌入式开发行业因硬件资源的限制和对稳定性的严苛要求,通常选择经过长期验证的稳定版本;

zheng_ruiguo的专栏 1415

【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)

LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。

m0_74774759的博客 2315

Android RIL(Radio Interface Layer)全面概述和知识要点(3万字长文)

在 Android 系统这个庞大而复杂的体系里,RIL(Radio Interface Layer,无线接口层)绝对是个关键角色。简单来讲,它就像一座桥梁,一头连着手机基带,另一头接着上层应用 ,在应用程序和调制解调器(Modem)之间搭建起了信息交流的通道。想象一下,咱们在手机上点击拨号按钮,或者编辑一条短信发送出去,这些操作产生的请求并不会直接到达手机的基带处理器。而是先由 RIL 接手,它把这些来自上层应用程序的请求,像拨号、发送短信这类,巧妙地转换成能够和基带处理器顺畅交互的命令。

大模型大数据攻城狮的专栏 1595

华为OD新系统机试真题 - API请求日志去重分析

华为OD新系统机试真题【API请求日志去重分析】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD4月15号机试真题【API请求日志去重分析】

qq_45776114的博客 914

力扣LeetCode第146题LRU缓存

力扣LeetCode第146题LRU缓存

weixin_44061444的博客 1004

FPGA实现LVDS接口(1)--IBUFDS原语、OBUFDS原语和IOBUFDS原语的介绍及使用(仿真/源码)

通过本文您会学到:Xinlix的源语IBUFDS、OBUFDS和IOBUFDS是什么?

孤独的单刀 2万+

力扣 Hot 100 刷题记录 - LRU 缓存

是力扣 Hot 100 中的一道经典题目,题目要求如下:请你设计并实现一个满足缓存约束的数据结构。实现LRUCachecapacitykey-1keyvaluekey-valuecapacity函数get和put必须以O(1)的平均时间复杂度运行。输入:输出:解释:// 缓存是 {1=1}// 缓存是 {1=1, 2=2}// 返回 1// 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}// 返回 -1 (未找到)

weixin_50893711的博客 2796

T507 buildroot linux4.9之RLT8211F 1000M以太网开发调试

调试T507的gmac,解决该RTL8211F 1000m以太网中调试遇到的问题

目前从事linux驱动开发,多交流多学习吧 686

【STM32 CubeMX】I2C中断方式与DMA方式

在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可以采用中断方式或DMA(Direct Memory Access)方式。中断方式通过触发中断来处理数据传输,而DMA方式则利用直接内存访问技术来实现数据传输,减轻了CPU的负担。在选择I2C通信方式时,开发者需要根据具体的应用需求和性能要求来选择合适的方式。STM32 CubeMX提供了图形化配置工具,使得配置I2C通信方式变得更加便捷。

m0_62599305的博客 7744

leetcode LRU 缓存

所以需要使用链表来表示缓存,当访问一个数据的时候需要将当前这个数据从原来的位置上删除,然后加到链表的头部,删除一个节点的话,需要将这个节点的前一个节点和下一个节点连接起来,如果使用单向链表的话,那么只能找到这个节点的下一个节点,找不到上一个节点,所以需要使用双向链表。(6)向缓存中放入数据 1,此时缓存是满的,所以需要先淘汰一个数据,从访问时间来看,最后一次访问 50 的间隔时间最长,也就是排在最右边的数据,所以将 50 淘汰,其它数据向后移动,将新数据 1 放入最左边的位置。

weixin_38184628的博客 1201

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

146. LRU 缓存 - 力扣(LeetCode)

请你设计并实现一个满足约束的数据结构。实现LRUCachecapacitykey-1keyvaluekey-valuecapacity函数get和put必须以O(1)的平均时间复杂度运行。输入输出解释// 缓存是 {1=1}// 缓存是 {1=1, 2=2}// 返回 1// 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}// 返回 -1 (未找到)// 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}// 返回 -1 (未找到)// 返回 3。

Dubhehug的博客 793

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

力扣C语言-146. LRU 缓存

【代码】力扣C语言-146. LRU 缓存。

weixin_46441088的博客 774

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

力扣146.LRU缓存

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

2301_80505422的博客 1357

力扣——146.LRU缓存

注意也要把map里面的key删除,这个key在node里面有(这就是为什么node里面也要存key)。对于获取:先看一下map里面有没有这个key,有的话返回这个node,并把这个。

weixin_49332521的博客 1699

LeetCode【0146】LRU 缓存

题目难度:中等;数据结构:哈希表和双向链表;应用算法: 头插法、虚拟节点技术

AnFany 817

LeetCode刷题---LRU缓存

如果哈希表中已经存储该节点,则需要对该节点的数据进行更新,首先根据key从哈希表中取出该节点,再对节点中的value重新赋值,之后根据LRU算法将该节点从链表中删除,再添加到链表表头的位置。在写put方法的时候,如果哈希表中未存储该节点,则创建一个新的节点,节点中key和value分别为要添加的键和值,之后将key和新创建的节点添加到哈希表中,在将新的节点添加到链表头部。在写get方法来获取某节点的时候,如果哈希表中存储了该节点,根据LRU算法,则先将该节点删除,再将该节点添加到链表中。

weixin_47109902的博客 2561

LRU 缓存的实现【Java实现,力扣Leetcode146. LRU 缓存】

力扣 T146.LRU缓存

拒绝八股,追寻本质。 603

力扣leetcode第146题LRU缓存机制

使用HashMap+双链表的方式实现。 使用HashMap可以在O(1)的时间查询到缓存key,使用双链表是因为插入的时候要在头部插入,删除最少使用的key需要尾部删除。 import java.util.HashMap; import java.util.Map; class LRUCache { /** * ["LRUCache","put","put","put","put","get","get","get","get","put","get","get","g..

u010523770的专栏 304
上一篇: LeetCode 将数组和减半的最少操作次数
下一篇: LeetCode N皇后(Hot 100)
Wenhao.
博客等级 码龄4年 77粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值