码迷,mamicode.com
首页 > 系统相关 > 详细

#leetcode#LRU Cache

时间:2015-07-22 10:53:19      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:leetcode

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.

set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.


分析: HashTable + DoublyLinkedList, LRU Cache中维护两个Node, first, last, 越靠近last的表示越least recently used,每次做get, set操作的时候,当前节点是 least recently used, 需要把他移动到LRU Cache中的last, 主要就是判断当前节点是否为first或者last,还有就是判断当前LRU的first/last 是否为null,学习了Code ganker大神的解法http://blog.csdn.net/linhuanmars/article/details/21310633, 看了思路之后自己试着写了个适合自己的版本

public class LRUCache {
    class Node{
        Node pre;
        Node next;
        int val;
        int key;
        public Node(int key, int val){
            this.val = val;
            this.key = key;
        }
    }
    
    private int capacity;
    private int num;
    private Node first;
    private Node last;
    private Map<Integer, Node> map;
    
    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.num = 0;
        this.map = new HashMap<Integer, Node>();
    }
    
    public int get(int key) {
        Node node = map.get(key);
        if(node == null){
            return -1;
        }
        if(node != last){
            if(node == first){
                first = first.next;
                if(first != null){
                    first.pre = null;
                }
            }else{
                node.next.pre = node.pre;
                node.pre.next = node.next;
            }
            last.next = node;
            node.pre = last;
            last = node;
            node.next = null;
        }
        return node.val;
    }
    
    public void set(int key, int value) {
        Node node = map.get(key);
        if(node == null){
            node = new Node(key, value);
            map.put(key, node);// don't forget to add new entry for new key - node pair.
            if(first == null){
                first = node;
                last = node;
                num++;
            }else{
                if(num == capacity){
                    map.remove(first.key);// don't forget to delete map key
                    first = first.next;
                    if(first != null){
                        first.pre = null;
                    }
                }else{
                    num++;
                }
                last.next = node;
                node.pre = last;
                last = node;
            }
        }else{
            node.val = value;
            if(node != last){
                if(node  == first){
                    first = first.next;
                }else{
                    node.pre.next = node.next;
                    node.next.pre = node.pre;
                }
                last.next = node;
                node.pre = last;
                last = node;
            }
        }
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

#leetcode#LRU Cache

标签:leetcode

原文地址:http://blog.csdn.net/chibaoneliuliuni/article/details/46997655

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!