• 146. LRU Cache


    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.

    难一点的设计的题一般就是double list + hashmap<key, node>[LRU , mid stack]  or tree + hashmap <key, node> [relation tree or tire]

    //new node in the tail, old node in the head;
    class DoubleList{
        int key;
        int val;
        DoubleList prev;
        DoubleList next;
        public DoubleList(int key, int val){
            this.key = key;
            this.val = val;
        }
    }
    public class LRUCache {
        int index = 0;
        int capacity;
        DoubleList tail;
        DoubleList head;
        HashMap<Integer, DoubleList> map;
        public LRUCache(int capacity) {
           this.capacity = capacity;
           this.map = new  HashMap<Integer, DoubleList>();
           this.head = new DoubleList(0,0);
           this.tail = new DoubleList(0,0);
           head.next = tail;
           tail.prev = head;
           this.index = 0;
        }
        
        public void addFirst(DoubleList node){
          node.next= head.next;
          node.next.prev = node;
          node.prev = head;
          head.next = node;
        }
        
        public void remove(DoubleList node){
            node.prev.next = node.next;
            node.next.prev = node.prev;
        }
        
        public int get(int key) {
          if(map.containsKey(key)){
             DoubleList node = map.get(key);
             remove(node);
             addFirst(node);
             return node.val;
          }
          return -1;
        }
        
        public void set(int key, int value) {
            if(map.containsKey(key)){
                map.get(key).val = value;
                DoubleList node = map.get(key);
                remove(node);
                addFirst(node);
                return;
            }
            else{
                DoubleList node =  new DoubleList(key, value);
                map.put(key, node);
                if(index < capacity){
                    index ++;
                    addFirst(node);
                }
                else{
                    map.remove(tail.prev.key);
                    remove(tail.prev);
                    addFirst(node);
                }
            }
        }
       
        
    }
  • 相关阅读:
    NOI2015 小园丁和老司机
    退役记
    留言板
    $mathfrak {reputation}$
    计算几何基础
    HNOI2018简要题解
    JXOI2018简要题解
    BJOI2018简要题解
    HAOI2018 简要题解
    CQOI2018简要题解
  • 原文地址:https://www.cnblogs.com/joannacode/p/5998949.html
Copyright © 2020-2023  润新知