qidao123.com技术社区-IT企服评测·应用市场

标题: 力扣——146.LRU缓存 [打印本页]

作者: 饭宝    时间: 2025-3-15 11:04
标题: 力扣——146.LRU缓存
题目链接:

https://leetcode.cn/problems/lru-cache/solutions/259678/lruhuan-cun-ji-zhi-by-leetcode-solution/?envType=study-plan-v2&envId=top-100-liked
题目描述:


思路:

综上,必要利用map和双向链表完成
详细要怎么做:
数据存储方式:map内里存放key和node,全部的node组成一个双向链表,node是双向链表的节点,node内里存放他的前后节点,以及key、value这两个值,一样平常来说node内里只必要存放value就行,但是这里也要放key,因为后面会用到。
对于新增:要把key和node放入map内里;先看一下map内里有没有这个key,有的话就更新原有node的value值;没有的话就加到map内里,同时,node加入双向链表的最前面,新增后还要看链表的长度是否已经凌驾容量,凌驾的话就把末了一个node删除,注意也要把map内里的key删除,这个key在node内里有(这就是为什么node内里也要存key)。
对于获取:先看一下map内里有没有这个key,有的话返回这个node,并把这个node放到链表最前面
实当代码:

  1. class LRUCache {
  2.     class Dulinked{
  3.         Dulinked prev;
  4.         Dulinked next;
  5.         int key;
  6.         int value;
  7.         public Dulinked(){};
  8.         public Dulinked(int _key,int _value){
  9.             key = _key;
  10.             value = _value;
  11.         }
  12.     }
  13.     private int size;
  14.     private Map<Integer,Dulinked> table = new HashMap<Integer,Dulinked>();
  15.     private int capacity;
  16.     private Dulinked head,end;
  17.     public LRUCache(int capacity) {
  18.         this.size = 0;
  19.         this.capacity = capacity;
  20.         head = new Dulinked();
  21.         end = new Dulinked();
  22.         head.next = end;
  23.         end.prev = head;
  24.     }
  25.    
  26.     public int get(int key) {
  27.         Dulinked node = table.get(key);
  28.         if(node == null){
  29.             return -1;
  30.         }
  31.         moveToHead(node);
  32.         return node.value;
  33.     }
  34.    
  35.     public void put(int key, int value) {
  36.         Dulinked node = table.get(key);
  37.         if(node == null){
  38.             Dulinked newNode = new Dulinked(key,value);
  39.             table.put(key,newNode);
  40.             addToHead(newNode);
  41.             size++;
  42.             if(size > capacity){
  43.                 Dulinked end = removeEnd();
  44.                 table.remove(end.key);
  45.                 size--;
  46.             }
  47.         }
  48.         else{
  49.             node.value = value;
  50.             moveToHead(node);
  51.         }
  52.     }
  53.     private void removeNode(Dulinked node){
  54.         node.prev.next = node.next;
  55.         node.next.prev = node.prev;
  56.     }
  57.     private void addToHead(Dulinked node){
  58.         head.next.prev = node;
  59.         node.next = head.next;
  60.         node.prev = head;
  61.         head.next = node;
  62.     }
  63.    
  64.     private void moveToHead(Dulinked node){
  65.         removeNode(node);
  66.         addToHead(node);
  67.     }
  68.     private Dulinked removeEnd(){
  69.         Dulinked res = end.prev;
  70.         removeNode(res);
  71.         return res;
  72.     }
  73. }
  74. /**
  75. * Your LRUCache object will be instantiated and called as such:
  76. * LRUCache obj = new LRUCache(capacity);
  77. * int param_1 = obj.get(key);
  78. * obj.put(key,value);
  79. */
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4