
本题核心就是要将map中,最近最少操作的那个key给剔除掉,于是我们可以使用双端链表LinkedList 来维护每个元素的操作情况,最近操作的元素就将其移至表头,越久没操作的元素,自然就会沉到表尾。 一旦缓存满了,将表尾元素剔除即可。 java代码如下:
- class LRUCache {
- private int capacity;
- Map
map = new HashMap<>(); - LinkedList
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);
- */