思路:
https://blog.csdn.net/luzhensmart/article/details/120219540
import java.util.*; public class Solution { /** * lru design * @param operators int整型二维数组 the ops * @param k int整型 the k * @return int整型一维数组 */ public int[] LRU (int[][] operators, int k) { int[] result = new int[k]; if (operators == null || operators.length == 0 || k < 1) { return result; } LRUCache lruCache = new LRUCache(k); List<Integer> resultList = new LinkedList<>(); for (int i = 0; i < operators.length; i++) { int[] data = operators[i]; int key = data[1]; if (data[0] == 1) { int value = data[2]; lruCache.put(key, value); } else if (data[0] == 2) { int val = lruCache.get(key); resultList.add(val); } } int[] resultArray = resultList.stream().mapToInt(Integer::intValue).toArray(); return resultArray; } class LRUCache { //头节点 Entry head; //尾节点 Entry tail; //map的容量 int capacity; //map中真实的数据数量 int size; Map<Integer, Entry> cacheMap; public LRUCache (int capacity) { this.capacity = capacity; initLinkedList(); this.size = 0; //lrc cacheMap的容量 + 头尾节点数量2 cacheMap = new HashMap<>(capacity + 2); } public void initLinkedList () { head = new Entry(); tail = new Entry(); head.next = tail; tail.pre = head; } public int get (int key) { Entry node = cacheMap.get(key); if (node == null) { return -1; } moveToHead(node); return node.value; } public void put (int key, int value) { Entry node = cacheMap.get(key); if (node != null) { //覆盖value node.value = value; moveToHead(node); return; } else { // 不存在。先加进去,再移除尾结点 // 此时容量已满 删除尾结点 if (size == capacity) { Entry lastNode = tail.pre; deleteNode(lastNode); cacheMap.remove(lastNode.key); size--; } Entry entry = new Entry(key, value); addNode(entry); cacheMap.put(key, entry); size++; } } public void moveToHead (Entry node) { deleteNode(node); addNode(node); } //移除双向链表中该节点的pre next指针 public void deleteNode (Entry node) { node.pre.next = node.next; node.next.pre = node.pre; } //向头节点之后 插入该节点 即头插法 public void addNode (Entry node) { node.next = head.next; head.next.pre = node; head.next = node; node.pre = head; } } class Entry { Entry pre; Entry next; int key; int value; public Entry () {} public Entry (int key, int value) { this.key = key; this.value = value; } } }