`

[Leetcode 146]LRU缓存机制

    博客分类:
  • java
 
阅读更多
public class Main {
    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);    // 该操作会使得密钥 2 作废
        System.out.println(cache.get(2));       // 返回 -1 (未找到)
        cache.put(4, 4);    // 该操作会使得密钥 1 作废
        System.out.println(cache.get(1));       // 返回 -1 (未找到)
        System.out.println(cache.get(3));       // 返回  3
        System.out.println(cache.get(4));       // 返回  4
    }


    private static class LRUCache {
        private HashMap<Integer, Node> map;
        private int size;
        private int capacity;
        private Node head, tail;

        public LRUCache(int capacity) {
            this.capacity = capacity;
            this.map = new HashMap<>(capacity);
            this.size = 0;
        }

        public void put(int key, int value) {
            Node node = getNode(key);
            if(node == null) {
                Node curNode = new Node(key, value);
                map.put(key, curNode);
                appendToTail(curNode);
                size++;
                adjustSize();
            } else {
                node.value = value;
            }
        }

        public int get(int key) {
            Node node = getNode(key);
            return node == null ? -1 : node.value;
        }

        private Node getNode(int key) {
            Node node = map.get(key);
            if(node == null) return null;

            if(node != tail) {
                if(node == head) {
                    head = node.next;
                    head.pre = null;
                } else {
                    node.pre.next = node.next;
                    node.next.pre = node.pre;
                }
                appendToTail(node);
            }
            return node;
        }

        // 添加到尾部
        private void appendToTail(Node node) {
            if(size == 0) {
                head = node;
                tail = node;
            } else {
                tail.next = node;
                node.pre = tail;
                node.next = null;
                tail = node;
            }
        }

        private void adjustSize() {
            while(size > capacity) {
                map.remove(head.key);
                head = head.next;
                head.pre = null;
                size--;
            }
        }

        private class Node {
            int key;
            int value;
            Node pre;
            Node next;

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

}

 

分享到:
评论

相关推荐

    lyj2014211626#Prepare_For_AI_Job#leetcode-146. LRU缓存机制1

    146. LRU缓存机制参考解法官方解法解法:双链接 + 哈希表* Your LRUCache object will be instantiated and

    java代码-LeetCode 146. LRU缓存机制

    LeetCode的第146题就是关于实现这样一个LRU缓存机制。 在这个Java代码实现中,我们需要关注以下几个关键知识点: 1. **数据结构选择**:LRU缓存通常用链表和哈希表(HashMap或HashTable)结合的方式来实现。链表...

    js-leetcode题解之LRU缓存-题解.zip

    在LeetCode这个在线编程挑战平台上,有一道关于实现LRU缓存的题目,而“js_leetcode题解之LRU缓存_题解.zip”文件正是针对这道题目的JavaScript解法。 LRU缓存的主要思想是:当缓存满时,优先淘汰最近最少使用的...

    open-gap#Leetcode-Road#146.LRU缓存机制1

    解法一:使用哈希表与双向链表的组合结构,又称为哈希链表 (题解)//双链表的容量// 使用list的迭代器可以在O(1)时间内完成元素删除操作**// 访问的

    python-leetcode面试题解之第146题LRU缓存-题解.zip

    在Python中,实现LRU缓存机制可以借助于`collections`模块中的`OrderedDict`或者`deque`双端队列。本题解将深入探讨第146题的LRU缓存问题,以及如何使用Python来解决此类问题。 首先,我们来看题目的具体要求。...

    zwangZJU#LeetCode-in-python-wznote#LeetCode-python-146-LRU缓存机制1

    示例// 返回 1// 该操作会使得密钥 2 作废// 返回 -1 (未找到)// 该操作会使得密钥 1 作废// 返回 -1 (未找到)// 返回 3// 返

    leetcode伪代码-LRUCache:LRU缓存机制

    LRU缓存 刷leetcode每日一题,记录一下 思路分析 使用哈希表解决查找和插入O(1)的问题 使用双向链表解决缓存热度 结合下就是哈希链表(#233) 实现过程 在实现的过程中,大部分时间花费在边界的处理,想砸键盘 巧用...

    leetCode 面试高频算法整理-2020

    模拟|1)加油站|2)LRU缓存机制|3)快乐数|4)生命游戏|5)两整数之和|6)FIZZ BUZZ|5.数组|1)乘积最大子序列|2)求众数|3)旋转数组|4)存在重复元素|5)移动零|6)打乱数组|7)两个数组的交集 II|8)递增的三元子序列|9)搜索二...

    工程师必须了解的LRU缓存淘汰算法以及python实现过程

    对于工程而言,缓存是非常非常重要的机制,尤其是在当下的互联网应用环境当中,起到的作用非常重要。为了便于大家更好地理解,我们从缓存的机制开始说起。 缓存 缓存的英文是cache,最早其实指的是用于CPU和主存...

    lrucacheleetcode-leetcode:leetcodeAC题目

    学习和理解LRU缓存机制以及如何在LeetCode上应用它,可以帮助开发者提升处理数据结构和算法问题的能力,这对求职面试和日常开发工作都是非常有价值的。同时,分析和研究提供的代码实现也能帮助深化对数据结构和算法...

    leetcode下载-LeetCodeAnimation:力码动画

    leetcode下载 我会尽力将LeetCode上所有的题目都用动画的形式演示出来,计划用3到4年时间去完成它,期待与你见证这一天!...LRU缓存机制 LRU缓存机制 2019-01-25 Made by Jun chen 150 逆波兰表达式求值 167 两数之

    lrucacheleetcode-LRU_Cache:LRU_Cache

    在计算机科学中,特别是在数据库、操作系统和编程语言的实现中,LRU缓存机制广泛应用于缓存淘汰算法。当缓存满时,最近最少使用的数据会被淘汰,以腾出空间给新的或者更频繁访问的数据。 LeetCode 是一个知名的在线...

    leetcode字符串括号level-LeetCode-Practice:[最后更新3/31]解决方案|想法|审查

    leetcode字符串括号level Leetcode Practice :seedling: BackTracking # Problems Level Comment 022 括号生成 Medium 046 ...146 LRU缓存机制 Medium Linked List # Problems Level Comment 002 两

    lrucacheleetcode-LRU_Cache:LRU_Cache是一个leetcode问题,需要深入了解数据结构。在LRU_Cache

    LRU_Cache是LeetCode的一个经典问题,旨在考察开发者对数据结构和算法的理解,特别是对LRU缓存机制的实现。 在这个问题中,你需要设计一个LRU缓存,它支持以下操作: 1. `get(key)`:如果键`key`存在于缓存中,则...

    LeetCode 经典题目精选 + 算法题目精选(Java 实现)

    里面包含 10 个 LeetCode 经典题目,是用 Java 语言实现的 包含:两数之和、爬楼梯、翻转二叉树、反转链表、LRU 缓存机制、最长回文子串、有效的括号、数组中的第 K 个最大元素、实现 Trie(前缀树)、编辑距离 等

    lrucacheleetcode-MyLeetcode:我的leetcode记录

    在LeetCode这个著名的在线编程挑战平台上,有很多题目与LRU缓存机制有关。"lrucacheleetcode-MyLeetcode:我的leetcode记录"这个项目可能是一位开发者或学习者用来记录他在LeetCode上解决的关于LRU缓存问题的代码和...

    lrucacheleetcode-LeetCode_CPP:LeetCode问题的cpp实现

    在计算机科学和软件工程中,特别是在数据结构和算法领域,LRU缓存机制经常被用到,尤其是在处理高并发、大数据量的问题时。在LeetCode上,有许多题目涉及到LRU缓存的实现和应用。 在C++编程中,LRU缓存通常通过设计...

    lrucacheleetcode-leetCode:日常生活

    在计算机科学和编程领域,LRU缓存机制常被用于提高数据访问效率,尤其是在数据库、操作系统和编程语言的内置数据结构中。LeetCode 是一个广受欢迎的在线编程挑战平台,提供各种算法题目,帮助开发者提升编程和算法...

    lrucacheleetcode-leetcode:leetcode练习

    在这个项目“lrucacheleetcode-leetcode”中,开发者显然是通过实现LRU缓存机制来解决LeetCode上的相关算法问题,以此进行编程练习。 在LeetCode平台上,LRU缓存的实现通常是通过设计一个数据结构,能够快速地完成...

    lrucacheleetcode-python-leetcode:Pythonleetcode

    学习和实践这些题目,不仅可以增强对LRU缓存机制的理解,还能提高Python编程技巧,以及对数据结构和算法的掌握。同时,参与LeetCode社区的讨论和分享,也有助于开阔视野,了解不同的解题思路和优化方法。所以,无论...

Global site tag (gtag.js) - Google Analytics