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

(nice!!!)(LeetCode 面试经典 150 题) 146. LRU 缓存 (哈希表+双向链表)

题目:146. LRU 缓存

在这里插入图片描述
在这里插入图片描述
思路:哈希表+双向链表,时间复杂度0(n)。

get、put时间复杂度必须为0(n),那么就得用空间换时间。双向链表来记录每一个节点node(key-value),哈希表来记录每一个key所对应的节点node。
在get、put时,先判断哈希表mp里是否存储了key,而双向链表是维护每一个节点的访问顺序。

C++版本:

class LRUCache {
// 节点node
typedef struct Node{int key;int val;Node * prev;Node * next;Node(int k,int v):key(k),val(v){}
}node;// 哈希表的最大容量
int capt;
// 双向链表的哨兵节点
node *head;
// 哈希表
unordered_map<int,node *> mp;public:// 将双向链表的节点x删除void deletee(node * x){x->prev->next=x->next;x->next->prev=x->prev;}// 将节点x插入到双向链表的头节点,也就是哨兵节点head的右边void insertt(node * x){x->prev=head;x->next=head->next;x->prev->next=x;x->next->prev=x;}// 初始化内置函数LRUCache(int capacity) {capt=capacity;head=new node(0,0);head->next=head;head->prev=head;}int get(int key) {if(mp.find(key)==mp.end()) return -1;deletee(mp[key]);insertt(mp[key]);return mp[key]->val;}void put(int key, int value) {// 哈希表存在keyif(mp.find(key)!=mp.end()){node * tmp=mp[key];tmp->val=value;deletee(tmp);insertt(tmp);return ;}// 哈希表不存在keymp[key]=new node(key,value);insertt(mp[key]);// 哈希表容量大于capacityif(mp.size()>capt){// 通过哨兵节点head找到最后一个节点node * bak=head->prev;deletee(bak);mp.erase(bak->key);delete bak;}}
};/*** Your LRUCache object will be instantiated and called as such:* LRUCache* obj = new LRUCache(capacity);* int param_1 = obj->get(key);* obj->put(key,value);*/

JAVA版本:

class LRUCache {class node{int key;int val;node prev,next;node(int k,int v){key=k;val=v;}}int capt;node head=new node(0,0);Map<Integer,node> mp=new HashMap<>();void deletee(node  x){x.prev.next=x.next;x.next.prev=x.prev;}void insertt(node x){x.prev=head;x.next=head.next;x.prev.next=x;x.next.prev=x;}LRUCache(int capacity) {capt=capacity;head.next=head;head.prev=head;}int get(int key) {if(mp.containsKey(key)==false) return -1;deletee(mp.get(key));insertt(mp.get(key));return mp.get(key).val;}void put(int key, int value) {if(mp.containsKey(key)==true){node tmp=mp.get(key);tmp.val=value;deletee(tmp);insertt(tmp);return ;}mp.put(key,new node(key,value));insertt(mp.get(key));if(mp.size()>capt){node bak=head.prev;deletee(bak);mp.remove(bak.key);}}
}/*** Your LRUCache object will be instantiated and called as such:* LRUCache obj = new LRUCache(capacity);* int param_1 = obj.get(key);* obj.put(key,value);*/

GO版本:

type node struct{key,val    intprev,next  *node
}type LRUCache struct {capacity inthead     *nodemp       map[int]*node
}func Constructor(capacity int) LRUCache {nd:=&node{key:0,val:0,}nd.prev=ndnd.next=ndreturn LRUCache{capacity :capacity,head     :nd,mp       :map[int]*node{},}
}func (this *LRUCache) deletee(x *node){x.prev.next=x.nextx.next.prev=x.prev
}func (this *LRUCache) insertt(x *node){x.prev=this.headx.next=this.head.nextx.prev.next=xx.next.prev=x
}func (this *LRUCache) getNode(key int) *node{nd,ok :=this.mp[key]if !ok {return nil}this.deletee(nd)this.insertt(nd)return nd
}func (this *LRUCache) Get(key int) int {nd:=this.getNode(key)if nd==nil {return -1}return nd.val
}func (this *LRUCache) Put(key int, value int)  {nd:=this.getNode(key)if nd!=nil {nd.val=valuereturn}this.mp[key]=&node{key :key,val :value,}this.insertt(this.mp[key])if len(this.mp)>this.capacity {bak:=this.head.prevthis.deletee(bak)delete(this.mp,bak.key)}return 
}/*** Your LRUCache object will be instantiated and called as such:* obj := Constructor(capacity);* param_1 := obj.Get(key);* obj.Put(key,value);*/
http://www.dtcms.com/a/322273.html

相关文章:

  • Go语言实战案例:文件上传服务
  • 香橙派 RK3588 部署千问大模型 Qwen2-VL-2B 推理视频
  • 在Docker中下载RabbitMQ(详细讲解参数)
  • BGP 笔记
  • C语言gdb调试
  • 母线电压采样芯片的四大类——汽车级选型对比表
  • 101和201复制卡技术难点与解决方案
  • Express中间件和路由及响应方法
  • 软件定义车辆加速推进汽车电子技术
  • Python如何将图片转换为PDF格式
  • 2025最新高频前端面试题解析(含Vue/React/JS核心考点)
  • day30-HTTP
  • Ubuntu Server 22 虚拟机空间扩容
  • B.10.01.3-性能优化实战:从JVM到数据库的全链路优化
  • stm32项目(25)——基于stm32的植物生长箱环境监测系统
  • 微信小程序中实现表单自动填充功能的方法
  • 自动化一键部署 LNMP 环境
  • NodeJs学习日志(3):express,sequelize进行增删改查(CRUD)
  • 【QT】QMainWindow:打造专业级桌面应用的基石
  • java之父-新特性
  • 数据结构(一)顺序表
  • 【JVM】深入解析Java虚拟机
  • Ubuntu下搭建LVGL模拟器
  • react之React.cloneElement()
  • 深入剖析C++ STL原理:打开高效编程大门的钥匙
  • [每周一更]-(第155期):深入Go反射机制:架构师视角下的动态力量与工程智慧
  • Web3: DeFi借贷的安全基石, 了解喂价与清算机制的原理与重要性
  • Typora上传图片保存到assets目录下
  • ARM CPU 安全更新:Training Solo(关于 Spectre-v2 攻击中域隔离机制的局限性)
  • 学习:JS[8]本地存储+正则表达式