`
blue2048
  • 浏览: 177913 次
  • 性别: 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保留...

    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 算法切题 ...

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

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

    word源码java-leetcode_solution:leetcode_solution

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

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

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

    javalruleetcode-interview-question-collection:面试问题收集

    java lru leetcode interview-question-collection 算法 leetcode n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N) 撸一个std::lower_bound,不断优化,直到最坏复杂度也为O(logN) 什么...

    leetcodelrucache-algorithm:算法学习和练习

    leetcode lrucache 目录 algorithm 基础算法 algorithm.tree BstChangeToLink: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 algorithm.lru LRUCache: 基于JavaLinkedHashMap实现的 LRU 算法 ...

    javalruleetcode-Diksha-singh:迪克沙辛格

    java lru leetcode LRU 缓存: #include #include 使用命名空间标准; // /* 146. LRU 缓存设计并实现最近最少使用(LRU)缓存的数据结构。 它应该支持以下操作:get 和 put。 get(key) - 如果键存在于缓存中,则...

    javalruleetcode-Algorithms:数据结构和算法

    java lru leetcode Algorithms 为什什么要学习算法与数据结构 编程的内功修炼 去国内一流互联网公司的必要条件 硅谷互联网公司面试更是要求当场写算法题目 算法和数据结构是有趣且实用的 Data Structure Array Stack...

    javalruleetcode-thinkermaster-arithmetic:学习算术并将其公开到thinkermaster.com

    java lru leetcode 开始 DaLiu Start... 数据结构 (data structure) 是相互之间存在一种或多种特定关系的数据元素的集合 研究的是数据的逻辑结构或物理结构 包括线性结构和非线性结构 算法(Algorithm) 是解题方案的...

    cpp-算法精粹

    LRU Cache Palindrome Linked List 字符串 Valid Palindrome Implement strStr() String to Integer (atoi) Add Binary Longest Palindromic Substring Regular Expression Matching Wildcard Matching Longest ...

Global site tag (gtag.js) - Google Analytics