`
blue2048
  • 浏览: 184248 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[leetcode]LRU Cache-java

阅读更多

注意一下几项

1. 借助linklist动态储存key的使用情况,将每次使用的key对应的节点变化到链表尾部,0位置为最少使用的key

2. 题目对时间复杂度有要求,linklist获得某个key,需要用O(1)的map查找,而是O(n)的循环查找

3. 根据以上两个条件,需要实现map+linklist的数据结构,linklist存储键值和最少用到的key,map根据key找到list对应的节点

 



 

 

public class LRUCache {
    
   private Map<Integer, Node> map;
    private Integer capacity;
    private Node head;
    private Node tail;

    private class Node {
        public Integer key;
        public Node parent;
        public Node next;
        public Integer value;

        private Node(Integer key, Node parent, Node next, Integer value) {
            this.key = key;
            this.parent = parent;
            this.next = next;
            this.value = value;
        }
    }

    public LRUCache(int capacity) {
        this.capacity = capacity;
        map = new HashMap<Integer, Node>(capacity, 1);
        head = new Node(null, null, null, null);
        tail = head;
    }

    public int get(int key) {
        if (!map.containsKey(key)) {
            return -1;
        }
        Node node = map.get(key);
        if(map.size() == 1){
            return node.value;
        }
        node.parent.next = node.next;
        if(node.next !=null){
            node.next.parent = node.parent;
        }else {
            tail = node.parent;
        }
        tail.next = node;
        node.parent = tail;
        tail = node;
        tail.next=null;
        return node.value;
    }

    public void set(int key, int value) {
        Node toDelNode = null;
        if (map.containsKey(key)) {
            toDelNode = map.get(key);
        } else if (map.size() == capacity) {
            toDelNode = head.next;
        }
        if(toDelNode != null){
            toDelNode.parent.next = toDelNode.next;
            if(toDelNode.next != null){
                toDelNode.next.parent = toDelNode.parent;
            }else{
                tail = toDelNode.parent;
            }
            map.remove(toDelNode.key);
            if(map.isEmpty()){
                tail = head;
            }
        }

        if(map.size() < capacity){
            Node node = new Node(key, tail, null, value);
            tail.next = node;
            tail = node;
            tail.next=null;
            map.put(key, node);
        }
    }

}

 

  • 大小: 35.7 KB
分享到:
评论

相关推荐

    javalruleetcode-LRUCache:LeetCode问题146Java中的LRU缓存

    Cache in Java 我很喜欢这个问题。 我在康奈尔大学的第一个 CS 课程涉及队列和其他数据结构。 对于其中一个课堂项目,我们必须开发基于队列的模拟。 在工作中,我开发了广泛的队列库。 我能说什么; 我喜欢队列和...

    javalruleetcode-java-lru-cache:Java中最近最少使用(LRU)缓存

    leetcode LRU缓存 Java 中最近最少使用 (LRU) 缓存。 测试 mvn test ------------------------------------------------------- T E S T S ------------------------------------------------------- Running ...

    javalruleetcode-java12-fundamentals-cache-implementations-workshop:LRU/

    java12-fundamentals-cache-implementations-workshop 参考 前言 本次研讨会的目标 理解 LRU 缓存的概念 理解 LFU 缓存的概念 实现 LRU 和 LFU 缓存 看看守卫在列表实现中是如何有用的 工作坊: lfu.workshop , lru....

    javalruleetcode-LeetCode-On-The-Way:只为LeetCode的答案

    用Java、Python、C++语言完成了LeetCode Online Judge的第一道题---二求和。 保持冷静并保持代码开启。 时间 08/08/2016 在假期里,我发生了一些事情。 时间 08/18/2016 完成阵列。 时间 08/21/2016 为github保留...

    leetcodelrucache-leetcode-LRUcache:leetcode-LRUcache

    它可能包含了用不同编程语言(如Java、Python或C++)编写的LRU Cache解决方案,以及相关的测试用例和说明文档。你可以通过查看这个项目来深入理解LRU Cache的工作原理,并学习如何在实际场景中应用它。 总结一下,...

    lrucacheleetcode-leetcode-java:力码研究

    这个项目"leetcode-java-master"提供了实现LRU缓存的一个具体示例,对于学习和复习Java编程以及数据结构与算法的人员来说,是一个宝贵的资源。 此外,"系统开源"的标签表明这个项目是开源的,意味着其他开发者可以...

    javalruleetcode-LRU_cache:LRU_cache

    LRU_cache (Leetcode 146) 设计和实现最近最少使用 (LRU) 缓存的数据结构。 它应该支持以下操作:get 和 set。 get(key) – 如果键存在于缓存中,则获取键的值(将始终为正),否则返回 -1。 set(key, value) – ...

    javalruleetcode-LRU-Cache:LRUCache在C中的实现,LRUCache在C++中的实现,LRUCache在Go中的

    java lru leetcode LRU缓存的实现 LRU - 最近最少使用。 完成清单: C C++ 去 JAVA(进行中) C 实现是完整的,并通过 Leetcode 上的 LRU 缓存问题进行了检查。 (C 实现是为了重新熟悉 C 并“回归基础”) C++ 中的...

    javalruleetcode-algorithm-java:leetcode刷题

    leetcode 算法练习刷题的仓库 理论基础:熟悉常见的数据结构、起码看过一本算法入门书 开始 git clone https://github.com/shenwl/algorithm-java.git cd algorithm-java mvn install mvn clean test 算法切题 ...

    谷歌师兄的leetcode刷题笔记-pw2163:Web编程工作文件夹2016年8月至12月

    《谷歌师兄的LeetCode刷题笔记——pw2163:Web编程工作文件夹2016年8月至12月》是一份珍贵的学习资源,它由一位在谷歌工作的师兄整理,涵盖了他在LeetCode上刷题的过程和心得,旨在帮助学习者提升编程技能,特别是...

    javalruleetcode-LeetCode-Solutions:LeetCode-解决方案

    本项目 "javalruleetcode-LeetCode-Solutions" 针对 LeetCode 上的 Java 相关问题,提供了一套解决方案,特别是针对基于LRU Cache(最近最少使用)策略的问题。本文将深入探讨 LRUCache 的实现原理,并结合 LeetCode...

    javalruleetcode-JavaCache:具有可配置驱逐策略(LRU或LFU)的缓存实现

    java lru leetcode 缓存 具有可配置驱逐策略(LRU 或 LFU)的缓存实现 LRU 策略的灵感来自 SO 的这个解决方案: LFU 策略是使用这种方法实现的,时间复杂度为 O(1):

    leetcode答案-leetcode:leetcode.com的答案

    LeetCode的部分题目涉及到系统设计,如"LRU缓存机制"(LRU Cache),这要求我们设计一个具有特定功能的数据结构,模拟真实世界中的缓存淘汰策略。在这个问题中,我们可以使用双向链表结合哈希表,实现高效的插入、...

    word源码java-leetcode_solution:leetcode_solution

    word源码java 算法与数据结构参考资料与典型题目 总览 训练准备和复杂度分析 复杂度分析 数组、链表、跳表 LRU Cache - Linked list: Redis - Skip List:、 Array 实战题目 (高频老题) Linked List 实战题目 实战...

    lrucacheleetcode-leetcode:leetcode

    在LeetCode上,这个LRU Cache问题提供了多种编程语言的解冔方案,包括Java、Python、C++等,这有助于学习者了解不同语言实现此类数据结构的差异。 此外,“系统开源”标签可能意味着这是一个关于开源项目的话题。在...

    lrucacheleetcode-leetCode-Note::books:力扣刷题记录笔记(JAVA版)

    lru cache leetcode LeetCode刷题方法 Commit图例 序号 emoji 在本项目中的含义 简写标记 (0) :party_popper: 初始化项目 :tada: (1) :memo: 更新文档,包括但不限于README :memo: (2) :light_bulb: 发布新的学习...

    javalruleetcode-leetcode:leetcode

    LRU Cache`(LRU 缓存机制)等。 4. **LRUCache 应用场景**: - 在数据库查询优化中,LRUCache 用于缓存最近查询过的数据,减少对数据库的访问,提高性能。 - 在网页服务器中,LRUCache 可用于缓存热门页面,减少...

    lrucacheleetcode-leetcode:leetcodeAC题目

    描述中的"lru cache leetcode leetcode AC题目汇总"进一步确认了这个压缩包包含的是关于LRU缓存的LeetCode解题集合,而且所有题目都已经实现了正确答案。"目前AC题目有: other AC题目 打印沙漏"可能是指除了LRU缓存...

    lrucacheleetcode-LeetCode_practice:力扣解决方案

    在LeetCode上,有一些典型的LRU缓存问题,例如"LRU Cache"(编号146),这道题目要求设计一个支持添加、删除和查询操作的数据结构,同时满足LRU的替换策略。通过这个项目,开发者可能已经实现了多种不同的解法,包括...

    JAVA基础技术框架详解一.pdf

    2. LRU Cache 的实现机制和应用场景。 3. Elasticsearch 的架构、索引机制、查询机制和应用场景。 云计算和物联网 1. 云计算的概念、特点和应用场景,云计算的服务模型和 deployment 模型。 2. Docker 的应用...

Global site tag (gtag.js) - Google Analytics