算法思路
题目要求设计一个LRU(Least Recent Used)缓存结构,即优先淘汰最久没有使用到的数据。最常规做法就是使用一个List将缓存索引保存起来:当缓存中每插入一条数据,就往List头插入该数据索引;而每次缓存被命中时,则将该数据索引挪到List头部;此外再用一个Map来保存缓存索引跟缓存值得关系;在缓存淘汰的时候,同时刷新List跟Map即可;
算法实现
public int[] LRU(int[][] operators, int k) {
List<Integer> result = new ArrayList<>();
ArrayList<Integer> lruKey = new ArrayList<>();
Map<Integer, Integer> lruMap = new HashMap<>();
for (int[] operator : operators) {
int opt = operator[0];
if (opt == 1) {
// 缓存淘汰:移除最不常用数据
if (lruKey.size() == k) {
Integer oldKey = lruKey.remove(lruKey.size() - 1);
lruMap.remove(oldKey);
}
// 插入一条缓存记录
lruKey.add(0, operator[1]);
lruMap.put(operator[1], operator[2]);
} else if (opt == 2) {
Integer key = operator[1];
// 缓存命中:将被命中数据移到头部
if (lruKey.contains(key)) {
result.add(lruMap.get(key));
lruKey.remove(key);
lruKey.add(0, key);
} else {
result.add(-1);
}
}
}
return result.stream().mapToInt(Integer::intValue).toArray();
} 
京公网安备 11010502036488号