URL:
https://leetcode.com/problems/lru-cache/description/
描述:
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
解题思路
主要利用双向链表和hash map实现
代码
class LRUCache {
static class Node{
int key;
int val;
Node pre;
Node post;
Node(int key,int val){
this.key = key;
this.val = val;
}
}
Node head,tail;
int size;
int capacity;
Map<Integer,Node> map;
public LRUCache(int capacity) {
this.head = null;
this.tail = null;
this.size = 0;
this.capacity = capacity;
this.map = new HashMap<Integer, Node>();
}
public int get(int key) {
if(!map.containsKey(key)) {
return -1;
}
Node temp = map.get(key);
remove(temp);
add(temp);
return temp.val;
}
public void put(int key, int value) {
Node temp;
if(map.containsKey(key)){
temp = map.get(key);
remove(temp);
map.remove(key);
size--;
}
if(size == capacity){
Node h = head;
remove(h);
map.remove(h.key);
size--;
}
temp = new Node(key,value);
add(temp);
map.put(key,temp);
size++;
}
private void add(Node n){
if(head == null && tail == null) {
head = n;
tail = n;
}else {
tail.post = n;
n.pre = tail;
tail = n;
}
}
private void remove(Node n){
if(n==head && n==tail){
head = null;
tail = null;
}else if(n == head) {
head = head.post;
head.pre = null;
} else if(n == tail) {
tail = tail.pre;
tail.post = null;
}else{
n.pre.post = n.post;
n.post.pre = n.pre;
}
n.pre = null;
n.post = null;
}
}
/**
* 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);
*/