您的位置:首页 > 其它

《leetcode》: LRU Cache

2016-07-20 17:23 302 查看

题目

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;
}
}
}
}




因此需要寻找更好的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: