题目
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.
get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
思路:超时
借用一个Map和List来完成,List得作用就是将每次操作的key放在最前面。这样,当满的时候,List的最后一个元素就是很久没有被使用过的,其对应的(key,value)应该在map中被删除。
但是这种方式不能AC,报超时,能优化的地方都进行了优化还是不行。
实现代码如下:
public class LRUCache {
private Map<Integer,Integer> map = null;
private List<Integer> list = new ArrayList<Integer>();
private int totalSize;
public LRUCache(int capacity) {
map = new HashMap<Integer,Integer>(capacity);
totalSize = capacity;
}
public int get(int key) {
if(map.containsKey(key)){
//将key放在最前面
//由于list的remove方法中的参数是索引下标
remove(key);
list.add(0, key);
return map.get(key);
}
return -1;
}
public void set(int key, int value) {
int mapSize = map.size();
boolean b_Contain = map.containsKey(key);
if(mapSize<totalSize&&!b_Contain){
map.put(key, value);
}
else if(mapSize<=totalSize&&b_Contain){
map.put(key, value);
//把key放在最前面
remove(key);
}
else if(mapSize==totalSize&&!b_Contain){
Integer k = list.get(list.size()-1);
//先在Map中删除最久没有使用的
map.remove(k, map.get(k));
map.put(key, value);
//list.remove(k);
remove(k);
}
//将key放在最前面
list.add(0, key);
}
private void remove(Integer k) {
int len = list.size();
for(int i=0;i<len;i++){
if(k.equals(list.get(i))){
list.remove(i);
break;
}
}
}
}
因此需要寻找更好的方法。