2023.10.26
本题核心就是要将map中,最近最少操作的那个key给剔除掉,于是我们可以使用双端链表LinkedList 来维护每个元素的操作情况,最近操作的元素就将其移至表头,越久没操作的元素,自然就会沉到表尾。 一旦缓存满了,将表尾元素剔除即可。 java代码如下:
class LRUCache {
private int capacity;
Map<Integer,Integer> map = new HashMap<>();
LinkedList<Integer> LRUlist = new LinkedList<>();
public LRUCache(int capacity) {
this.capacity = capacity;
}
public int get(int key) {
if(map.containsKey(key)){
LRUlist.remove((Integer)key);
LRUlist.addFirst(key);
return map.get(key);
}
else return -1;
}
public void put(int key, int value) {
//找到该元素
if(map.containsKey(key)){
LRUlist.remove((Integer)key);
LRUlist.addFirst(key);
map.put(key,value);
}
//未找到该元素
else{
//map内元素未超出容量,直接put
if(map.size() < capacity){
map.put(key,value);
LRUlist.addFirst(key);
}
//map内元素超出容量capacity,先删掉最近最少未使用的元素,再put
else{
int temp = LRUlist.removeLast();
map.remove(temp);
map.put(key,value);
LRUlist.addFirst(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);
*/