LRU缓存(Leetcode146)

例题:

分析:

       题目要求函数get和put要达到O(1)的时间复杂度,可以用 hashMap 来实现,因为要满足逐出最久未使用的元素的一个效果,还需要配合一个双向链表来共同实现。链表中的节点为一组key-value。

我们可以用双向链表来储存数据(key-value),当调用put方法添加数据时,可以将数据(key-value)添加到双向链表的队头,队头的元素表示最新使用的元素,越靠近队尾,就是最久未用的元素。

当调用get方法时,若存在此元素,则从双向链表中把该组数据(key-value)提到队头来。

代码实现:
package leetcode;

import java.util.HashMap;

public class LRUCacheLeetcode146 {

    static class LRUCache {

        static class Node{
            Node next;
            Node prev;
            int key;
            int value;
            public Node(){

            }

            public Node(int key, int value) {
                this.key = key;
                this.value = value;
            }
        }

        static class DoublyLinkedList{
            Node head;
            Node tail;

            public DoublyLinkedList() {
                head = tail = new Node();
                head.next = tail;
                tail.prev = head;
            }

            //头部添加 head<->1<->2<->tail    假如添加3
            public void addFirst(Node newNode){
                Node oldFirst = head.next;
                oldFirst.prev = newNode;
                head.next = newNode;
                newNode.prev = head;
                newNode.next = oldFirst;
            }

            //已知节点删除  head<->1<->2<->tail  假如删除2
            public void remove(Node node){
                Node prev = node.prev;
                Node next = node.next;
                prev.next = next;
                next.prev = prev;
            }

            //尾部删除
            public Node removeLast(){
                Node last = tail.prev;
                remove(last);
                return last;
            }
        }

        private final HashMap<Integer, Node> map = new HashMap<>();
        private final DoublyLinkedList list = new DoublyLinkedList();
        private final int capacity;
        public LRUCache(int capacity) {
            this.capacity = capacity;
        }

        public int get(int key) {
            if(!map.containsKey(key)){
                return -1;
            }
            Node node = map.get(key);
            //hash表中存在该数据,改组数据应放到队头
            //先从中删除原始数据
            list.remove(node);
            //再将改组数据添加到队头
            list.addFirst(node);
            return node.value;
        }

        public void put(int key, int value) {
            if(map.containsKey(key)){ //更新
                Node node = map.get(key);
                node.value = value;
                list.remove(node);
                list.addFirst(node);
            }else{ //添加
                Node newNode = new Node(key, value);
                map.put(key, newNode);
                list.addFirst(newNode);
                if(map.size() > capacity){
                    Node removed = list.removeLast();
                    //删除hash表中的数据
                    map.remove(removed.key);
                }
            }
        }
    }

    public static void main(String[] args) {
        LRUCache cache = new LRUCache(2);
        cache.put(1, 1);
        cache.put(2, 2);
        System.out.println(cache.get(1)); // 1
        cache.put(3, 3);
        System.out.println(cache.get(2)); // -1
        cache.put(4, 4);
        System.out.println(cache.get(1)); // -1
        System.out.println(cache.get(3)); // 3
    }
}

相关推荐

  1. LeetCode-146.LRU缓存(Python)

    2024-02-01 08:46:05       43 阅读
  2. LeetCode--代码详解 146.LRU缓存

    2024-02-01 08:46:05       24 阅读
  3. leetcode题解C++】146. LRU缓存

    2024-02-01 08:46:05       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-01 08:46:05       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-01 08:46:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-01 08:46:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-01 08:46:05       18 阅读

热门阅读

  1. LeetCode 第22天

    2024-02-01 08:46:05       37 阅读
  2. Linux下Docker Compose安装指南

    2024-02-01 08:46:05       40 阅读
  3. 力扣242-有效的字母异位词

    2024-02-01 08:46:05       39 阅读
  4. HiveSQL题——炸裂函数(explode/posexplode)

    2024-02-01 08:46:05       29 阅读
  5. dockerfile结合go应用程序的简单应用

    2024-02-01 08:46:05       28 阅读
  6. 「HDLBits题解」Verification: Writing Testbenches

    2024-02-01 08:46:05       32 阅读
  7. C Primer Plus(第六版)14.18 编程练习 第7题

    2024-02-01 08:46:05       31 阅读
  8. CCF-CSP——仓库规划

    2024-02-01 08:46:05       36 阅读
  9. C Primer Plus(第六版)14.18 编程练习 第9题

    2024-02-01 08:46:05       33 阅读
  10. C语言探索:冒泡排序的实现与解读

    2024-02-01 08:46:05       29 阅读
  11. 【算法每日一题 1】CordCoverMaxPoint

    2024-02-01 08:46:05       29 阅读