为最近最少使用(LRU)缓存策略设计一个数据结构,它应该支持以下操作:获取数据(get)和写入数据(set)。
获取数据get(key):如果缓存中存在key,则获取其数据值(通常是正数),否则返回-1。
写入数据set(key, value):如果key还没有在缓存中,则写入其数据值。当缓存达到上限,它应该在写入新数据之前删除最近最少使用的数据用来腾出空闲位置。
样例
样例1
输入:
LRUCache(2)
set(2, 1)
set(1, 1)
get(2)
set(4, 1)
get(1)
get(2)
输出:
[1,-1,1]
解题思路1:
直接使用LinkedHashMap,可保证插入顺序的HashMap。关键步骤是在创建linkedHashMap instance时,要重载removeEldestEntry函数,目的是在map.size() > capacity时,自动移除掉最少使用的元素.
另外,by passing in true, we turned out access-order, whereas the default was insertion-order. 这个参数实现了LRU,不管是get还是put, 都会放到latest.
public class LRUCache {
Map<Integer, Integer> map;
int cap;
/*
* @param capacity: An integer
*/public LRUCache(int capacity) {
// do intialization if necessary
cap = capacity;
map = new LinkedHashMap<Integer, Integer>(cap, 0.75f, true){
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return size() > cap;
}
};
}
/*
* @param key: An integer
* @return: An integer
*/
public int get(int key) {
// write your code here
if(!map.containsKey(key))
return -1;
return map.get(key);
}
/*
* @param key: An integer
* @param value: An integer
* @return: nothing
*/
public void set(int key, int value) {
// write your code here
map.put(key, value);
}
}
解题思路2:
依然是LinkedHashMap,但这次自己处理边界情况:
(1) 任何被get或被set的元素都会被移到LinkedHashMap的最后;
(2) 若新插入元素后,LinkedHashMap超出capacity,则移除首位元素。
public class LRUCache {
private Map<Integer, Integer> map = new LinkedHashMap<>();
private int capacity;
/*
* @param capacity: An integer
*/public LRUCache(int capacity) {
// do intialization if necessary
this.capacity = capacity;
}
/*
* @param key: An integer
* @return: An integer
*/
public int get(int key) {
// write your code here
if(map.get(key) == null)
return -1;
int val = map.remove(key);
map.put(key, val);
return val;
}
/*
* @param key: An integer
* @param value: An integer
* @return: nothing
*/
public void set(int key, int value) {
// write your code here
if(map.containsKey(key)){
map.remove(key);
map.put(key, value);
return;
}
if(capacity <= map.size())
map.remove(map.keySet().iterator().next());
map.put(key, value);
}
}