使用链表来模拟缓存结构,表头元素表示最近使用的key
set
检查链表中是否存在该key,若有则更新map中保存的value,并将该key从链表中删除同时在链表头插入。若没有该key,则在链表头插入该key(注意需要先判断链表大小是否越界,若越界则先删除链表尾元素再头插)
get
若链表中有该key,则返回对应的value,同时在链表中删除该key,再在头部插入。
若没有,返回-1
import java.util.*;
public class Solution {
LinkedList<Integer> list = new LinkedList<>();
int k = 0;
List<Integer> ans = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
/**
* lru design
* @param operators int整型二维数组 the ops
* @param k int整型 the k
* @return int整型一维数组
*/
public int[] LRU (int[][] operators, int k) {
// write code here
this.k = k;
for(int i = 0; i < operators.length;i++){
if(operators[i][0] == 1){
set(operators[i][1], operators[i][2]);
}else{
get(operators[i][1]);
}
}
int[] res = new int[ans.size()];
for(int i = 0; i < ans.size();i++){
res[i] = ans.get(i);
}
return res;
}
public void set(int key, int val){
if(list.contains(key)){
list.remove((Object)key);
list.addFirst(key);
map.put(key, val);
return;
}
if(list.size() == k){
map.remove(list.getLast());
list.removeLast();
}
list.addFirst(key);
map.put(key, val);
}
public void get(int key){
if(list.contains(key)){
list.remove((Object)key);
list.addFirst(key);
ans.add(map.get(key));
return;
}
ans.add(-1);
}
}
京公网安备 11010502036488号