LeetCode刷题3:LRU缓存机制
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
具体题目:146. LRU 缓存 - 力扣(LeetCode) (leetcode-cn.com)
首先设计哈希表加双向链表的数据结构
HashMap<Integer,Node>cache
通过哈希表的键可以找到缓存数据在双向链表中的位置,而双向链表主则按照键值对使用的顺序进行顺序存储
class LRUCache { private int cap; public Node head; public Node tail; public HashMap<Integer,Node>cache;
//初始化缓存 public LRUCache(int capacity) { cache=new HashMap<>(); head=new Node(-1,-1); tail=new Node(-1,-1); head.next=tail; tail.pre=head; this.cap=capacity; } public int get(int key) { Node node=cache.get(key); if(node==null) return -1; moveToTail(node,node.val);//最近使用 return node.val; } public void put(int key, int value) { if(cache.containsKey(key)){//已存在则为最近使用,移到末尾 Node node=cache.get(key); moveToTail(node,value); } else { if(cache.size()==this.cap){//cache是否已满 Node node=head.next; delete(node); cache.remove(node.key); } Node newNode=new Node(key,value); insertTail(newNode); cache.put(key,newNode); } } public void insertTail(Node node){ node.pre=tail.pre; node.next=tail; tail.pre.next=node; tail.pre=node; } public void delete(Node node){ node.pre.next=node.next; node.next.pre=node.pre; } public void moveToTail(Node node,int val){ delete(node); insertTail(node); node.val=val; } } class Node{ public int val; public int key; public Node pre; public Node next; public Node(int key,int val){ this.key=key; this.val=val; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix