首页 > 代码库 > 【leetcode刷题笔记】LRU Cache
【leetcode刷题笔记】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.
题解:用双向链表实现一个LRU cache,这里自定义越靠近链表头的node,在越近的时间使用过。支持两个操作——get和set:
- get(key):如果链表中有key对应的node,返回该node的值,并把node移到链表头部(最近使用过);如果没有,返回-1;
- set(key,value):如果链表中已经有key对应的node,修改对应node的值为value(但不需要把这个node放在头结点处);如果链表中没有key对应的node,那么要新建node插入链表中,但此时要看链表是否还有空间。如果没有,就将尾部node(最少使用的node)删除,然后在头部插入新的node。
为了提高查找效率,这里使用一个hashMap存放<key,node>键值对,这样就可以在O(1)的时间判断cache中是否存在对应的key。
代码如下:
1 public class LRUCache { 2 private class Node{ 3 int value; 4 int key; 5 Node before; 6 Node after; 7 public Node(int key,int value){ 8 this.value =http://www.mamicode.com/ value; 9 this.key = key;10 before = null;11 after = null;12 }13 }14 15 private int capacity;16 private HashMap<Integer, Node> map = new HashMap<Integer,Node>();17 private Node headNode = new Node(-1, -1);18 private Node tailNode = new Node(-1, -1);19 20 public LRUCache(int capacity) {21 this.capacity = capacity;22 headNode.after = tailNode;23 tailNode.before = headNode;24 }25 26 public void move_to_head(Node current){27 current.after = headNode.after;28 headNode.after = current;29 current.before = headNode;30 current.after.before = current;31 }32 public int get(int key) {33 //if we don‘t have this node34 if(!map.containsKey(key))35 return -1;36 37 //if we have this node, get it and move it to head38 Node current = map.get(key);39 current.before.after = current.after;40 current.after.before = current.before;41 move_to_head(current);42 43 return map.get(key).value; 44 }45 46 public void set(int key, int value) {47 //if we already have this node,just change its value48 if(get(key) != -1){49 map.get(key).value =http://www.mamicode.com/ value;50 return;51 }52 53 //if we indeed don‘t have this node, we first check capacity54 if(map.size() == capacity){55 map.remove(tailNode.before.key);56 tailNode.before.before.after = tailNode;57 tailNode.before = tailNode.before.before;58 }59 60 //now we are sure we have space for this new node,put it ahead of the list61 Node newNode = new Node(key, value);62 map.put(key, newNode);63 move_to_head(newNode);64 }65 }
在实现的时候,还设置了两个node:head和tail,真正的cache数据节点存放在二者之间。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。