二刷
lingkedhashmap
获取元素
cache.keySet().iterator().next();
import java.util.*; public class Solution { /** * lru design * @param operators int整型二维数组 the ops * @param k int整型 the k * @return int整型一维数组 */ Map<Integer, Integer> cache; int cap; public int[] LRU (int[][] operators, int k) { // write code here this.cache = new LinkedHashMap<>(); this.cap = k; ArrayList<Integer> list = new ArrayList<>(); for(int[] ops:operators){ if(ops[0] == 1){ set(ops[1],ops[2]); }else{ list.add(get(ops[1])); } } int[] res = new int[list.size()]; int i = 0; for(int val:list){ res[i] = list.get(i); i++; } return res; } public void set(int key, int value){ if(cache.size()>=cap){ if(cache.containsKey(key)) cache.remove(key); else{ int oldkey = cache.keySet().iterator().next(); cache.remove(oldkey); } } cache.put(key,value); } public int get(int key){ if(!cache.containsKey(key)) return-1; else { int value = cache.get(key); cache.remove(key); cache.put(key,value); return value; } } }
手写双链表
import java.util.*; public class Solution { /** * lru design * @param operators int整型二维数组 the ops * @param k int整型 the k * @return int整型一维数组 */ class Node { int val,key; Node prev,next; Node(int key, int val) { this.val = val; this.key = key; } } class DoubleList { private Node head, tail; private int size; //头插法 public void addFirst(Node x){ if(head == null){ head = tail = x; } else{ Node temp = head; temp.prev = x; x.next = temp; head = x; } size++; } //去掉中间的一个节点 public void removeNode(Node x){ if(head == tail){ head = tail = null; } else if(x == head){ head = head.next; head.prev = null; } else if(x == tail){ tail = tail.prev; tail.next = null; } else{ x.prev.next = x.next; x.next.prev = x.prev; } size--; } //去掉尾节点 最不常用 public Node removeLast(){ Node x =tail; removeNode(tail); return x; } public int size(){ return size; } } class LRUcache{ private HashMap<Integer, Node> map; private DoubleList cache; private int cap; public LRUcache(int capacity){ this.cap = capacity; map = new HashMap<>(); cache = new DoubleList(); } public int get(int key){ if(!map.containsKey(key)){ return -1; } else{ Node node = map.get(key); int value = node.val; set(key,value); return value; } } public void set(int key, int val){ Node x = new Node(key,val); if(map.containsKey(key)){ Node node = map.get(key); cache.removeNode(node); cache.addFirst(x); map.put(key,x); } else{ if(cache.size()==cap){ Node last = cache.removeLast(); map.remove(last.key); } cache.addFirst(x); map.put(key,x); } } } public int[] LRU (int[][] operators, int k) { LRUcache lru = new LRUcache(k); ArrayList<Integer> list = new ArrayList<>(); for(int i = 0, j = 0; i < operators.length; i++) { if(operators[i][0] == 1) { lru.set(operators[i][1], operators[i][2]); } else { list.add(lru.get(operators[i][1])); } } int[] res = new int[list.size()]; int i = 0; for(int val:list){ res[i] = list.get(i); i++; } return res; } }