LeetCoce 146. LRU Cache

For LRU cache, it's like a fifo queue but reassign the existing value to the first if we use the value(get). Based on fifo, one may think of using a pair to record the key and value and put them into a queue, however, it takes much time to search/delete for a value in a queue O(N). Alternatively, we can use doublyLinkedList to maintain the relationships between pairs(nodes) and easily remove/change any nodes. Then we use a hashmap to keep track of <key, node>pair to help get the node value in O(1).

For get method, we need to consider:

1. key contains in hashmap: bring to the front, return value;

2.key not contains in hashmap: return -1;

For put method, we need to consider:

1. if hashmap has the key :  change the value through hashmap, remove the old node in DLL, add the new node in the front;

2. else if capacity > 0: capacity--, add to hashmap, add the new node to the front

3. else: delete the tail node, delete the pair in hashmap, add the new node to front, add to hashmap.


Code:

class LRUCache {

    public DLinkedListNode head;

    public DLinkedListNode tail;

    int capacity;

    HashMap<Integer, DLinkedListNode> hm;

    class DLinkedListNode {

        int key;

        int value;

        DLinkedListNode prev;

        DLinkedListNode next;

    }

    public LRUCache(int capacity) {

        head = new DLinkedListNode();

        tail = new DLinkedListNode();

        head.next = tail;

        tail.prev = head;

        hm = new HashMap<>();

        this.capacity = capacity;

    }


    public int get(int key) {

        if(hm.containsKey(key)){

            DLinkedListNode c = hm.get(key);

            movetoFront(c);

            return c.value;


        }

        return -1;

    }


    public void movetoFront(DLinkedListNode cur){

        remove(cur);

        addFront(cur);

    }


    public void remove(DLinkedListNode cur){

        DLinkedListNode next = cur.next;

        DLinkedListNode prev = cur.prev;

        prev.next = next;

        next.prev = prev;

    }


    public void addFront(DLinkedListNode cur){

        DLinkedListNode next = head.next;

        head.next = cur;

        cur.next = next;

        next.prev = cur;

        cur.prev = head;

    }


    public void removeLast(){

        DLinkedListNode t = tail.prev;

        hm.remove(t.key);

        DLinkedListNode tPrev = t.prev;

        tail.prev = tPrev;

        tPrev.next = tail;

    }


    public void put(int key, int value) {

        if(hm.containsKey(key)){

            DLinkedListNode newNode = new DLinkedListNode();

            newNode.key = key;

            newNode.value = value;

            remove(hm.get(key));

            addFront(newNode);

            hm.replace(key, newNode);


            return;

        }

        if(capacity > 0){

            DLinkedListNode newNode = new DLinkedListNode();

            newNode.key = key;

            newNode.value = value;

            hm.put(key, newNode);

            addFront(newNode);

            capacity--;

        }else{

            DLinkedListNode newNode = new DLinkedListNode();

            newNode.key = key;

            newNode.value = value;

            removeLast();

            addFront(newNode);

            hm.put(key, newNode);


        }

    }

}


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357