leetcode 146. LRU缓存机制 golang实现

lrucacheleetcode-LeetCode_Solutions_CPP:力扣_解决方案_CPP lru缓存leetcode 力扣_解决方案_CPP 有我的解决方案。 可以找到 cpp 解决方案的每个(我已经完成)代码。 您也可以从下表中获得直接链接。 我将提供讨论一些经典或特色测试的链接。 您可以使用Ctrl-F来精确地找到解决方案。 不。 问题名称 链接到代码 链接讨论 189 --- 179 —— --- 174 —— --- 173 —— --- 172 --- 171 --- 170 —— --- 169 168 --- 167 —— --- 166 —— --- 165 --- 164 —— --- 163 —— --- 162 —— --- 161 —— --- 160 --- 159 —— --- 158 —— --- 157 —— --- 156 —— --- 155 --- 154 —— --- 153 —— --- 152 —— --- 151 150 —— --- 149 —— --- 148 147 —— --- 146 —— --- 145 —— --- 144 143 —— --- 142 —— --- 141 —— --- 140 —— --- 13 立即下载
描述
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。

进阶:

你是否可以在 O(1) 时间复杂度内完成这两种操作?

示例:

LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // 返回  1
cache.put(3, 3);    // 该操作会使得密钥 2 作废
cache.get(2);       // 返回 -1 (未找到)
cache.put(4, 4);    // 该操作会使得密钥 1 作废
cache.get(1);       // 返回 -1 (未找到)
cache.get(3);       // 返回  3
cache.get(4);       // 返回  4

思路
利用双向链表和map实现 map存储key对应的双向链表中的节点 双向链表用来实现LRU
1. get操作 需要将map 中key对应的节点移动到头部位置
2. put操作 如果key存在 更新value 并将map 中key对应的节点移动到头部位置 ,不存在的话需要判断是否超出容量 如果超出, 则删除尾部节点并
将新节点插到头部位置,没有超出 则直接插到头部位置
实现
type LRUCache struct {
	Head *LRUCacheNode
	Last *LRUCacheNode
	Cap  int
	Map  map[int]*LRUCacheNode
}

type LRUCacheNode struct {
	Key   int
	Value int
	Pre   *LRUCacheNode
	Next  *LRUCacheNode
}

func Constructor(capacity int) LRUCache {					// 设置容量
	cache := LRUCache{}
	cache.Cap = capacity
	cache.Map = make(map[int]*LRUCacheNode)

	return cache
}

func (this *LRUCache) Get(key int) int {
	if node, ok := this.Map[key]; ok {
		if node == this.Last && node != this.Head {			// 如果需要移动的节点是最后一个且不是第一个 更新this.Last指针
			this.Last = node.Pre
		}
		this.Head = DoubleLinkMoveToHead(node, this.Head)	// 将节点移动到头位置
		return node.Value
	} else {
		return -1
	}
}

func (this *LRUCache) Put(key int, value int) {
	if node, ok := this.Map[key]; ok {
		node.Value = value									// 更新key对应的value
		if node == this.Last && node != this.Head {			// 如果需要移动的节点是最后一个且不是第一个 更新this.Last指针
			this.Last = node.Pre
		}
		this.Head = DoubleLinkMoveToHead(node, this.Head)	// 将节点移动到头位置
		return
	} else if len(this.Map) >= this.Cap {					// 如果超出容量 则删除最后一个节点 并删除map对应的key
		lastKey := this.Last.Key
		last := this.Map[lastKey]
		this.Last = last.Pre
		DoubleLinkDelete(last)
		delete(this.Map, lastKey)
	}

	this.Head = DoubleLinkInsert(this.Head, key, value)		// 删除后 插入新节点到头部位置

	this.Map[key] = this.Head								// 更新新节点的位置到map

	if len(this.Map) == 1 {									// 如果当前只有一个节点 则last 和head 指向同一位置
		this.Last = this.Head
	}

	return
}

func DoubleLinkInsert(head *LRUCacheNode, key, value int) *LRUCacheNode {	// 插入新节点
	newNode := new(LRUCacheNode)
	newNode.Key = key
	newNode.Value = value
	if head == nil {
		return newNode
	} else {
		newNode.Next = head
		head.Pre = newNode
		return newNode
	}
}

func DoubleLinkDelete(node *LRUCacheNode) {							// 删除指定节点
	pre := node.Pre
	next := node.Next

	if pre != nil {
		pre.Next = next
	}

	if next != nil {
		next.Pre = pre
	}

	node = nil
}

func DoubleLinkMoveToHead(node *LRUCacheNode, head *LRUCacheNode) *LRUCacheNode {	// 移动指定节点到头部位置
	if node != head {
		DoubleLinkDelete(node)
		node.Next = head
		node.Pre = nil
		head.Pre = node
		return node
	}

	return head
}
lrucacheleetcode-leetcode:个人刷leetcode遇到的一些题汇总(golang) lru cache leetcode leetcode 记录自己刷leetcode时遇到的一些值得记下来的题目, 分为一些子项 bytedance daily:每日一题 struct-algorithm:数据结构/算法先关 top-100:leetcode 热题100 .go文件以题目url后缀命名, 比如n-queens-ii对应链接为: 题目 url add-two-numbers find-peak-element longest-common-subsequence longest-consecutive-sequence max-area-of-island next-greater-element-ii serialize-and-deserialize-binary-tree subarray-sum-equals-k binary-tree-preorder-traversal n-queens-ii populating-next-right-pointers-in-each-node sum-root-to-leaf-numbers best-time-to-buy 立即下载

相关推荐

lrucacheleetcode-leetcode:leetcode算法学习记录golang版

lru cache leetcode Leetcode 参考: leetcode 经典题目解析&golang版代码 简单难度 中等难度 困难难度 算法专项 KMP 算法 动态规划: 887. 鸡蛋掉落 5. 最长回文子串 494. 目标和 322. 零钱兑换 279. 完全平方数 198. 打家劫舍 152. 乘积最大子序列 139. 单词拆分 121. 买卖股票的最佳时机 91. 解码方法 62. 不同路径 53. 最大子序和 栈: 155. 最小栈 栈: 20. 有效的括号 [极客时间推荐] 链表: 206. 反转链表 链表: 24. 两两交换链表中的节点 [leetcode字节跳动题库] select * from "题库" where "难度" = '中等' order by "出题指数" desc limit 50; 动态规划 146. LRU缓存机制 [设计] 5. 最长回文子串 [动态规划] 56. 合并区间 [排序] [数组] 322. 零钱兑换 [动态规划] 300. 最长上升子序列 [动态规划] 221. 最大正方形 [动态规划] 53. 最大子序和 [动态规划]

【golang必备算法】 Letecode 146. LRU 缓存机制

146. LRU 缓存机制 思路:哈希表 + 双向链表 为什么必须要用双向链表? 因为我们需要删除操作。删除一个节点不光要得到该节点本身的指针,也需要操作其前驱节点的指针,而双向链表才能支持直接查找前驱,保证操作的时间复杂度 O(1)。 为什么要在链表中同时存储 key 和 val,而不是只存储 val? 当缓存容量已满,我们不仅仅要删除最后一个节点,还要把哈希表 中映射到该节点的 key 同时删除,而这个 key 只能由 节点得到。如果 节点结构中只存储 val,那么我们就无法得知 key 是什么,

weixin_45901764的博客 300

【上海大学计算机组成原理实验报告】六、内存系统实验

学习内存访问机制//理解代码和数据的分区存放原理和技术//手动方式把立即数`33H`写入内存`D1H`单元//手动方式把`D1H`单元的内容读出,再送入`ST`单元//在`CP226`汇编语言程序集成开发环境下编写程序//既然有`ORG`微指令,为什么集成开发环境下载到实验箱的目标程序的第一条执行语句最好存放在0号地址?//上海大学计算机组成原理实验//内存系统实验

HackerKevon的博客 3128

LeetCode--146. LRU 缓存【Golang中的list】

好题,想写一下,虽然之前用C++写过一次,但是不太熟悉c++的面向对象,也是云里雾里的,只会写个函数,这次也想熟悉一下golang的container/list。Golang里面有这么一个list真是太棒了~

Rinai的博客 1112

C++开发基础之掌握常用的三种异步编程模型

以上是三种常见的C++异步编程模型,每种模型都有其适用的场景和特点。根据具体需求,你可以选择合适的模型来进行异步编程。

dotnet研习社 2175

Keil5实战:如何高效导出变量数据并实现可视化分析

本文详细介绍了在Keil5开发环境中,如何利用调试脚本高效导出程序运行时变量数据的方法。通过编写脚本自动捕获数据并保存为文件,再结合Excel或Python进行可视化分析,为嵌入式调试与算法优化提供了数据支撑,显著提升开发效率。

silver的专栏 1105

go语言实现LRU

对应leetcode官网链接。

SUNZHONGWU5234的博客 628

Palabos 并行计算与多物理场模拟实战指南

本文详细介绍了Palabos在并行计算与多物理场模拟中的实战应用。作为基于C++和LBM的开源CFD工具,Palabos通过MPI实现高效并行计算,特别适合处理复杂流体模拟问题。文章涵盖从基础安装、多物理场耦合技巧到性能优化策略,并分享工业级应用案例与调试经验,帮助开发者快速掌握这一强大工具。

4k5l6j7h8的博客 243

面试高频题: LRU缓存机制实现

题目 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 进阶: 你是否可以在O(1) 时间复杂度内完成这两种操作? ..

9608

DeepSeek高阶应用:DeepSeek+Coze构建智能文献综述与趋势分析自动化系统

本文详细介绍了如何利用DeepSeek与Coze构建智能文献综述与趋势分析自动化系统。通过DeepSeek的深度语义理解和结构化信息提取能力,结合Coze的可视化工作流编排,实现学术论文的自动解析、分类整理与知识入库。该系统能7x24小时自动追踪领域前沿,将研究人员从繁琐的文献处理中解放出来,专注于更高层次的思考与创新。

weixin_29050271的博客 179

PostgreSQL高可用之主备复制

多个PostgreSQL可协同工作,如果主库发生宕机备库将迅速进行接管并对外提供服务以实现高可用。本文将从主备复制、主备切换、故障转移等角度进行实际测试演练。第一章主备复制是基础,通过主备复制可以得到一个或多个相同的实例。在主备复制的基础上通过第二章主备切换介绍了如何手工将主库与备库互换角色。在第三章中,采用了Keepalived进行实时监测,在主库宕机后,使用主备切换中提到的命令使备库升级为主库并对外提供服务,以达到PostgreSQL高可用的目标。

asdasdsaff的博客 1348

LeetCode0146.LRU缓存机制 Go语言AC笔记

带虚拟头尾节点的双向链表+哈希表解决超高频面试题!

Hexa_H的博客 238

【零基础入门unity游戏开发——unity通用篇30】Resources资源加载(基于unity6开发介绍)

Resources资源加载(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4116

力扣--146LRU缓存机制Go语言实现

本文实现了一个LRU(最近最少使用)缓存结构,使用哈希表和双向链表相结合的方式,保证所有操作在O(1)时间内完成。核心设计包括:哈希表快速查找,双向链表维护访问顺序,新节点添加到头部,超过容量时删除尾部最久未使用节点。数据结构包含带伪头尾节点的双向链表和键值映射表,主要操作Get和Put都确保O(1)复杂度,通过辅助方法实现节点移动和删除。该实现满足LRU缓存的各项功能要求,包括快速访问、更新和容量控制。

2502_93365655的博客 1161

《网络安全自学教程》- Nmap使用及扫描原理分析

使用Nmap进行端口扫描、主机发现、服务识别、操作系统识别、指定脚本、结果导出文件,使用wireshark抓包分析扫描原理。

wangyuxiang946的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【LeetCode 热题100】146:LRU 缓存(详细解析)(Go语言版)

本文详细解析了力扣 146 题——LRU 缓存机制的实现方法。通过结合哈希表与双向链表,确保 `get` 和 `put` 操作均在 O(1) 时间内完成。哈希表用于快速查找,双向链表记录访问顺序,支持最近使用数据的高效更新与淘汰。代码以 Go 语言实现,结构清晰,涵盖核心操作如节点移动、插入与删除。此题为面试高频考点,适用于数据缓存、页面置换等场景,掌握后可加深对缓存策略的理解。

小韩的博客 565

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

面试常客LRU/LFU算法别死记:用Go刷LeetCode 146和460,一次搞懂区别

本文深入解析了LRU和LFU两种缓存淘汰算法的核心原理与Go语言实现,通过LeetCode 146和460题的实战演示,帮助开发者理解其区别与应用场景。文章详细介绍了LRU的最近最少使用策略和LFU的最不经常使用策略,提供了完整的Go代码实现,并分析了它们在面试中的常见问题及优化技巧。

weixin_33725270的博客 337

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

golang LRU、LFU、跳表

【代码】golang LRU、LFU、跳表。

weixin_44575660的博客 304

Leetcode 146:LRU缓存机制[CPP][GO]

问题描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最...

KongJHong的博客 279

【Day21】146.LRU缓存 (Least Recently Used)

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类: - LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 - int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 - void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入

2301_80182689的博客 1333

LeetCode 146. LRU缓存机制Golang版

LeetCode 146. LRU缓存机制Golang版 1. 问题描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。 实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插

菜到不敢run 230

LeetCode热题100--146.LRU缓存--中等

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

2301_80071187的博客 709

LeetCode-146-LRU缓存机制

运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制 。 实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,

qq_43269370的博客 162

leetcode 146. LRU缓存机制 medium (重要)

leetcode146. LRU缓存机制 medium (重要) 题目描述: 运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, valu...

speargod的博客 276

leetcode 146 LRU缓存

这道题在面试中被问到的概率较大,因为既考察了链表,又考察了哈希表,又有一定的综合能力,比较容易扩展。在本题中,实现LRU缓存是用哈希表+双向链表来实现。注意双向链表一般会加上头尾的伪结点来方便定位。请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。

谜底的博客 226

leetcode146 LRU cache Design

第一次写这种类型的程序,感觉挺好玩的.LRU就是 Least Recently Used.LRU Cache就是一种缓存机制,当缓存已经满了的时候,最近最少使用的元素移出缓存换上新的元素. 我们采用双向链表来判断最近最少使用的元素.我们保存指向双向链表的所有元素的指针,当访问一个元素的时候,把双向链表中的该元素移动到队尾.即只要使用某个元素,就把该元素移动到队尾,所以队尾是最近最多使用的元素,队...

LOVETEDA的博客 357
上一篇: leetcode 253. 会议室 II golang实现
下一篇: leetcode 394. 字符串解码 golang实现
tzh_linux
博客等级 码龄12年 12粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值