题解 | #设计LRU缓存结构#

设计LRU缓存结构

http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61

import java.util.*;
 class LruCache{
    class DListNode{
            int key;
            int value;
            DListNode prev;
            DListNode next;
            public DListNode(){}
            public DListNode(int _key,int _value){key = _key;value = _value;}
        }

    Map<Integer,DListNode> cache;
    int capacity = 0,size = 0;
    static DListNode head,tail;

    public LruCache(int capacity){
        this.capacity = capacity;
        cache = new HashMap<>();
        size = 0;
        head = new DListNode();
        tail = new DListNode();
        head.next = tail;
        tail.prev = head;
    }
        public void set(int key,int value){
        DListNode node = cache.get(key);
        if(node == null){
            DListNode add = new DListNode(key,value);
            insertToHead(add);
            ++size;
            cache.put(key,add);
            if(size > capacity){
                DListNode rnode = removeTail();
                cache.remove(rnode.key);
                --size;
            }
        }
        else{
            node.value = value;
            moveToHead(node);
        }
    }
    public int get(int key){
        DListNode node = cache.get(key);
        if(node == null){
            return -1;
        }
        else {
            moveToHead(node);
            return node.value;
        }
    }
    public void remove(DListNode node){
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }
    public void insertToHead(DListNode add){
        add.prev = head;
        head.next.prev = add;
        add.next = head.next;
        head.next = add; 
    }
    public void moveToHead(DListNode node){
        remove(node);
        insertToHead(node);
    }
    public DListNode removeTail(){
        DListNode node = tail.prev;
        remove(node);
        return node;
    }
}

public class Solution {   
    public int[] LRU (int[][] operators, int k) {
        int M = operators.length;
        List<Integer> res = new ArrayList<>();
        LruCache lru = new LruCache(k);

        for(int i = 0;i<M;i++){
            if(operators[i][0] == 1){
                int key = operators[i][1];
                int value = operators[i][2];
                lru.set(key,value);
            }
            else{
                int key = operators[i][1];
                res.add(lru.get(key));
            }            
        }
        int n = res.size();
        int[] fin = new int[n];
        for(int i = 0;i<n;i++){
            fin[i] = res.get(i);
        }
        return fin;
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务