題目
146. LRU緩存機制
題解
1 直接用LinkedHashMap來完成
class LRUCache {
private LinkedHashMap<Integer, Integer> map;
public LRUCache(int capacity) {
map = new LinkedHashMap<Integer, Integer>(capacity, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<Integer,Integer> eldest){
return size() > capacity;
}
};
}
public int get(int key) {
return map.getOrDefault(key, -1);
}
public void put(int key, int value) {
map.put(key, value);
}
}
2 用LinkedList 和HashMap來完成
1 put
1 判斷key
是否已經在哈希遍歷存在的了,如果存在那麼就就要更新哈希表裏的value
,還有吧原來的list的key
值給 remove
了,然後 addLast
2 如果不存在list直接addLast,哈希表添加新的值
2 查詢
1 如果存在,那麼list remove,同時addLast ,同時從HashMap返回值
2 如果不存在,返回-1;
public class LruCache01 {
int capacity = 0;
LinkedList<Integer> list = null;
HashMap<Integer, Integer> map = null;
public LruCache01(int capacity) {
this.capacity = capacity;
list = new LinkedList<>();
map = new HashMap<>();
}
public int get(int key) {
if (map.containsKey(key)) {
list.remove(new Integer(key));
list.addLast(key);
return map.get(key);
}
return -1;
}
public void put(int key, int value) {
if (map.containsKey(key)) {
list.remove(new Integer(key));
list.addLast(key);
map.put(key, value);
} else {
list.addLast(key);
map.put(key, value);
if (list.size() > this.capacity) {
int keyTemp = list.removeFirst();
map.remove(keyTemp);
}
}
}
}