链接:https://oj.leetcode.com/problems/lru-cache/
描述:
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.
方法一:
简单的用两个数组实现。
超时
class LRUCache
{
private:
vector<int> _key;
vector<int> _value;
int _capacity;
int _size;
public:
LRUCache(int capacity)
{
_key.resize(capacity);
_value.resize(capacity);
_capacity = capacity;
_size = 0;
};
int get(int key)
{
int index = -1;
for(int i = 0; i < _size; ++i)
{
if(_key[i] == key){
index = i;
break;
}
}
if(index == -1)
return index;
int tempValue = _value[index];
int tempKey = _key[index];
for(int i=index-1; i >= 0; --i )
{
_value[i+1] = _value[i];
_key[i+1] = _key[i];
}
_value[0] = tempValue;
_key[0] = tempKey;
return tempValue;
};
void set(int key, int value)
{
if( get(key) != -1)
return;
for(int i=_size-1; i > 0; --i )
{
_value[i] = _value[ i - 1 ];
_key[i] = _key[ i - 1 ];
}
_value[0] = value;
_key[0] = key;
if(_size < _capacity)
_size++;
};
};
借助list,访问先后顺序极为list的顺序,借助hash加速查找,两方面都做到常数时间。Accept
代码如下:
struct cacheNode{
int _key;
int _value;
cacheNode(int key, int value): _key(key), _value(value){}
};
class LRUCache2
{
private:
list<cacheNode> cacheList;
map<int, list<cacheNode>::iterator> cacheMap;
int _capacity;
int _size;
public:
LRUCache2(int capacity): _capacity(capacity){
_size = 0;
}
int get(int key)
{
if( cacheMap.find(key) == cacheMap.end() )
return -1;
else{
cacheList.splice(cacheList.begin(), cacheList, cacheMap[key]);
cacheMap[key]=cacheList.begin();
return cacheMap[key]->_value;
}
}
void set(int key, int value)
{
if( cacheMap.find(key) != cacheMap.end() )
{
cacheList.splice(cacheList.begin(), cacheList, cacheMap[key]);
cacheMap[key] = cacheList.begin();
cacheMap[key]->_value = value;
}else{
cacheList.insert(cacheList.begin(), cacheNode(key, value));
cacheMap[key] = cacheList.begin();
if( _size < _capacity){
_size++;
}else{
int lastKey = cacheList.back()._key;
cacheList.pop_back();
cacheMap.erase(cacheMap.find(lastKey));
}
}
}
};