2022-8-3 剑指offer-LRU数据结构-双向链表+哈希

剑指 Offer II 031. 最近最少使用缓存

难度中等

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

实现 LRUCache 类:

  • LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
 1 class LRUCache {
 2     Map<Integer,Node> map;
 3     Node head;
 4     Node tail;
 5     int size;
 6     public LRUCache(int capacity) {
 7         map=new HashMap<>();
 8         head=new Node();
 9         tail=new Node();
10         head.next=tail;
11         tail.prev=head;
12         size=capacity;
13     }
14     
15     public int get(int key) {
16         if (map.size()==0||!map.containsKey(key)) return -1;
17         Node node=map.get(key);
18         removeNode(node);
19         addNode(node);
20         map.put(key,node);
21         return node.val;
22     }
23     
24     public void put(int key, int value) {
25         if (!map.containsKey(key)){
26             if (map.size()>=size){
27                 Node del=tail.prev;
28                 map.remove(del.key);
29                 removeNode(del);
30             }
31             Node node=new Node(key,value);
32             addNode(node);
33             map.put(key,node);
34         }else{
35             Node node=map.get(key);
36             removeNode(node);
37             node.val=value;
38             addNode(node);
39             map.put(key,node);
40         }
41     }
42 
43     //头部插入新的
44     public void addNode(Node node){
45         node.prev=head;
46         node.next=head.next;
47         head.next.prev=node;
48         head.next=node;
49     }
50 
51     //去掉节点
52     public void removeNode(Node node){
53         Node p=node.prev;
54         Node n=node.next;
55         p.next=n;
56         n.prev=p;
57     }
58 }
59 
60 
61 class Node{
62     int key;
63     int val;
64     Node prev;
65     Node next;
66     Node(){
67     }
68     Node(int key,int val){
69         this.key=key;
70         this.val=val;
71     }
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  */

思路:哈希加双向链表实现。

posted on 2022-08-03 10:57  阿ming  阅读(23)  评论(0编辑  收藏  举报

导航