[LeetCode]146. LRU 缓存(java实现)哈希表+双链表

[LeetCode]146. LRU 缓存(java实现)哈希表+双链表

  • 1. 题目
  • 2. 读题(需要重点注意的东西)
  • 3. 解法
  • 4. 可能有帮助的前置习题
  • 5. 所用到的数据结构与算法思想
  • 6. 总结

1. 题目

[LeetCode]146. LRU 缓存(java实现)哈希表+双链表_第1张图片
[LeetCode]146. LRU 缓存(java实现)哈希表+双链表_第2张图片
[LeetCode]146. LRU 缓存(java实现)哈希表+双链表_第3张图片

2. 读题(需要重点注意的东西)

思路(哈希表+双链表):

哈希表: 键值对 存储 keyvaluekey值 以及 节点 Node

双链表: 存储节点 Node ,节点中key值对应输入的key值,val值对应输入的value值;用双链表实现 时间戳 ,左新右旧,将使用过的节点放在链表开头的位置,内存满的时候删除最右的节点即可

3. 解法

---------------------------------------------------解法---------------------------------------------------

// 定义双链表节点
class Node{
    int key,val;
    Node left,right;
    Node(int key,int val){
        this.key = key;
        this.val = val;
    }
}

class LRUCache {
    Map<Integer,Node> hashmap = new HashMap<>();
    Node L,R;
    int n;
    public LRUCache(int capacity) {
        n = capacity;
        L = new Node(-1,-1);
        R = new Node(-1,-1);
        L.right = R;
        R.left = L;
    }
    
    public int get(int key) {
        if(!hashmap.containsKey(key)) return -1;
        Node p = hashmap.get(key);
        // 将p插入双链表表头
        remove(p);
        insert(p);
        return p.val; 
    }
    
    public void put(int key, int value) {
        // 哈希表中存在这个值,修改
        if(hashmap.containsKey(key)){
            Node p = hashmap.get(key);
            p.val = value;
            remove(p);
            insert(p);
        }else{ // 哈希表中不存在这个值,插入这个值
            // 内存满了,删除最后一个节点
            if(hashmap.size() == n){
                Node p = R.left;
                remove(p);
                hashmap.remove(p.key);
            }
            Node p = new Node(key,value);
            insert(p);
            hashmap.put(key,p);
        }
    }

    public void remove(Node p){
        p.right.left = p.left;
        p.left.right = p.right; 
    }

    public void insert(Node p){
        p.left = L;
        p.right = L.right;
        L.right.left = p;
        L.right = p;
    }
}

/**
 * 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);
 */

可能存在的问题:

4. 可能有帮助的前置习题

5. 所用到的数据结构与算法思想

  • 双链表
  • 哈希表

6. 总结

双链表来构成时间戳,让最近被使用过的节点放到链表头,内存满的时候删除最后一个节点即可。

你可能感兴趣的:(LeetCode深度解析,算法,leetcode,java)