LeetCode 146. LRU缓存机制Golang版

news/2025/3/15 16:25:55/

LeetCode 146. LRU缓存机制Golang版

1. 问题描述

运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。
实现 LRUCache 类:

LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。

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

2. 思路

3. 代码

type LRUCache struct {size intcapacity intcache map[int]*DLinkedNodehead, tail *DLinkedNode
}type DLinkedNode struct {key, value intprev, next *DLinkedNode
}func initDLinkedNode(key, value int) *DLinkedNode {return &DLinkedNode{key: key,value: value,}
}func Constructor(capacity int) LRUCache {l := LRUCache {cache : map[int]*DLinkedNode{},head : initDLinkedNode(0, 0),tail : initDLinkedNode(0, 0),capacity: capacity,}l.head.next = l.taill.tail.prev = l.headreturn l
}func (this *LRUCache) Get(key int) int {if _, ok := this.cache[key]; !ok {return -1}node := this.cache[key]this.moveToHead(node)return node.value
}func (this *LRUCache) Put(key int, value int)  {if _, ok := this.cache[key]; !ok {node := initDLinkedNode(key, value)this.cache[key] = nodethis.addToHead(node)this.size++if this.size > this.capacity {removed := this.removeTail()delete(this.cache,removed.key)this.size--}} else {node := this.cache[key]node.value = valuethis.moveToHead(node)}
}func (this *LRUCache) moveToHead(node *DLinkedNode) {this.removeNode(node)this.addToHead(node)
}func (this *LRUCache) addToHead(node *DLinkedNode) {node.prev = this.headnode.next = this.head.nextthis.head.next.prev = nodethis.head.next = node
}func (this *LRUCache) removeTail() *DLinkedNode {node := this.tail.prevthis.removeNode(node)return node
}func (this *LRUCache) removeNode(node *DLinkedNode) {node.prev.next = node.nextnode.next.prev = node.prev
}/*** Your LRUCache object will be instantiated and called as such:* obj := Constructor(capacity);* param_1 := obj.Get(key);* obj.Put(key,value);*/

http://www.ppmy.cn/news/813740.html

相关文章

使用微信公众号回复带有外链的文字

后台发送 使用客服消息回复文字&#xff0c;按照以下格式&#xff1a; 您好&#xff0c;< a href’https://www.baidu.com‘>点我进行页面跳转

我的世界服务器皮肤怎么用文件夹,我的世界怎么用皮肤文件,怎么通过文件夹更改皮肤...

打开versions&#xff0c;我的世界怎么用文件换皮肤教程里百面有个小茶壶形状的文件&#xff0c;用压度缩工具打开它&#xff0c;依次打知开assets&#xff0c;minecraft&#xff0c;&#xff0c;textures&#xff0c;entity&#xff0c;先将里面自带道的原皮肤删掉&#xff0c…

ios在微信中遇见的bug

ios在微信中目前遇见的bug 1.ios在微信浏览器中不能获取文本域的焦点 将有这几个属性删除即可 * {-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none; } input {-webkit-user-sel…

基础|01|CPU缓存知识(待完善0.3)

&#xff08;写在前面&#xff0c;本文还没写完&#xff0c;争取在2022.2.1前写完&#xff0c;觉得可以的话&#xff0c;可以先关注噢&#xff09; 概览 由于各存储结构的速度不同&#xff0c;容量和价格上也不同&#xff0c;因此 1、对于单个CPU产生了缓存架构 既然有了缓…

我的世界服务器皮肤文件夹在哪里,我的世界青龙皮肤文件,启动侠皮肤文件夹在哪个文件夹...

你皮肤站&#xff0c;我的世界人物皮肤文件夹是哪个文件夹要先创建角色&#xff0c;填上名字&#xff0c;创建角色完毕。然后要选择皮肤&#xff0c;保存之后。进入mc看看有没有你的皮肤&#xff0c;如果没有&#xff0c;就代表你没有皮肤站里面的小插件&#xff0c;那就下载皮…

微信小程序原声自定义日期选择器

date.wxml <view><!-- table表格--><view class"table-container"><!-- 年份 月份选择 --><view class"table-date"><view><span bindtap"back" data-date"year" class"table-dateFont…

微信公众号测试环境开发

在公众平台沙箱环境中注册 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?actionshowinfo&tsandbox/index 获取appID和appsecret 测试号信息 appID wxf4da******0e17 appsecret f57f1fa521******0e4bb3 接口配置信息 填写接收微信推送消息接口的URL与token&…

【SpringBoot+VUE后台管理系统】(六)Excel导入导出功能实现

文章目录 一、导入hutool 工具包以及poi相关依赖二、编写用户导出接口三、导入接口实现1、方式一2、方式二四、前端用户管理对接导入1、导出按钮添加点击事件2、在axios.js中将请求的BaseUrl也放到vue容器中3、定义导出的方法 获取BaseUrl进行拼接导出的接口地址3、导出的数据加…