算法思路
题目要求设计一个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(); }