LeetCode 刷题【146. LRU 缓存】
146. LRU 缓存

自己做
解:集合哈希

class LRUCache {Map<Integer, Integer> data;Map<Integer, Integer> key_time; //根据key查询时间Map<Integer, Integer> time_key; //根据时间查询keyint now_time = 0; //当前时间int len = 0; //最大数据存放量public LRUCache(int capacity) {data = new HashMap();key_time = new HashMap();time_key = new TreeMap();len = capacity;}public int get(int key) {if(data.containsKey(key)){ //找到数据time_key.remove(key_time.get(key)); //更新访问时间time_key.put(now_time, key);key_time.put(key, now_time++); //返回数据return data.get(key);}return -1;}public void put(int key, int value) {if(data.containsKey(key)){ //判断数据原先是否存在data.put(key, value); //更新数据time_key.remove(key_time.get(key)); //更新原本的时间time_key.put(now_time, key);key_time.put(key, now_time++);}else{ //正常添加if(data.size() == len){ //队满了Map.Entry<Integer, Integer> firstEntry = time_key.entrySet().iterator().next(); //淘汰最早的(时间最前的)int k = firstEntry.getValue();time_key.remove(key_time.get(k));key_time.remove(k);data.remove(k);}data.put(key, value);key_time.put(key, now_time);time_key.put(now_time++, key);}}
}/*** Your LRUCache object will be instantiated and called as such:* LRUCache obj = new LRUCache(capacity);* int param_1 = obj.get(key);* obj.put(key,value);*/

看题解
官方题解:双向链表+哈希

public class LRUCache {class DLinkedNode {int key;int value;DLinkedNode prev;DLinkedNode next;public DLinkedNode() {}public DLinkedNode(int _key, int _value) {key = _key; value = _value;}}private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();private int size;private int capacity;private DLinkedNode head, tail;public LRUCache(int capacity) {this.size = 0;this.capacity = capacity;// 使用伪头部和伪尾部节点head = new DLinkedNode();tail = new DLinkedNode();head.next = tail;tail.prev = head;}public int get(int key) {DLinkedNode node = cache.get(key);if (node == null) {return -1;}// 如果 key 存在,先通过哈希表定位,再移到头部moveToHead(node);return node.value;}public void put(int key, int value) {DLinkedNode node = cache.get(key);if (node == null) {// 如果 key 不存在,创建一个新的节点DLinkedNode newNode = new DLinkedNode(key, value);// 添加进哈希表cache.put(key, newNode);// 添加至双向链表的头部addToHead(newNode);++size;if (size > capacity) {// 如果超出容量,删除双向链表的尾部节点DLinkedNode tail = removeTail();// 删除哈希表中对应的项cache.remove(tail.key);--size;}}else {// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部node.value = value;moveToHead(node);}}private void addToHead(DLinkedNode node) {node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}private void removeNode(DLinkedNode node) {node.prev.next = node.next;node.next.prev = node.prev;}private void moveToHead(DLinkedNode node) {removeNode(node);addToHead(node);}private DLinkedNode removeTail() {DLinkedNode res = tail.prev;removeNode(res);return res;}
}作者:力扣官方题解
链接:https://leetcode.cn/problems/lru-cache/solutions/259678/lruhuan-cun-ji-zhi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
