LeetCode 146 LRU Cache

 

146. LRU Cache

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

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
put(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.

Follow up:
Could you do both operations in O(1) time complexity?

Example:

LRUCache cache = new LRUCache( 2 /* capacity */ );

cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // returns 1
cache.put(3, 3);    // evicts key 2
cache.get(2);       // returns -1 (not found)
cache.put(4, 4);    // evicts key 1
cache.get(1);       // returns -1 (not found)
cache.get(3);       // returns 3
cache.get(4);       // returns 4
    public class Node<T, D>
    {
        public T data;
        public D name;
        public Node<T, D> next;
        public Node<T, D> pre;
    }

    public class NodeList<T, D>
    {
        //List<Node<T>> _nodeList = new List<Node<T>>();
        Node<T, D> head;
        Node<T, D> tail;
        public void Add(Node<T, D> node)
        {
            if (null == head)
            {
                head = node;
                tail = node;
                return;
            }

            head.next = node;
            node.pre = head;
            node.next = null;
            head = node;
        }

        public Node<T, D> GetHead()
        {
            return head;
        }

        public Node<T, D> GetTail()
        {
            return tail;
        }

        public void RemoveTail()
        {
            if (null == tail)
            {
                return;
            }
            if (tail.next != null)
            {
                tail = tail.next;
                tail.pre = null;
            }
            else
            {
                tail = null;
            }
        }

        public void MoveToFirst(Node<T, D> node)
        {
            if (head == node)
            {
                return;
            }
            if (node == tail)
            {
                tail = node.next;
                tail.pre = null;
            }
            if (node.pre != null)
            {
                node.pre.next = node.next;
                node.next.pre = node.pre;
            }
            head.next = node;
            node.next = null;
            node.pre = head;
            head = node;
        }
    }

    public class LRUCache
    {
        Dictionary<int,Node<int,int>> _dict = new Dictionary<int,Node<int,int>>();
        NodeList<int, int> _keyList = new NodeList<int, int>();
        int _capacity;
        public LRUCache(int capacity)
        {
            _capacity = capacity;
        }


        public int Get(int key)
        {
            Node<int,int> val;
            if (_dict.TryGetValue(key, out val))
            {
                _keyList.MoveToFirst(val);
                return val.data;
            }
            else
            {
                return -1;
            }
        }

        public void Put(int key, int value)
        {
            Node<int,int> val;
            if (0 == _capacity)
            {
                return;
            }
            if (_dict.TryGetValue(key, out val))
            {
                _dict[key].data = value;
                _keyList.MoveToFirst(_dict[key]);
            }
            else
            {
                if (_dict.Count == _capacity)
                {
                    var item = _keyList.GetTail();
                    _dict.Remove(item.name);
                    _keyList.RemoveTail();
                }
                Node<int, int> node = new Node<int, int>();
                node.name = key;
                node.data = value;
                _keyList.Add(node);
                _dict.Add(key,node);
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值