题解 | #设计LRU缓存结构#
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
C++ 哈希表,易理解
class Solution {
public:
/**
* lru design
* @param operators int整型vector<vector<>> the ops
* @param k int整型 the k
* @return int整型vector
*/
struct Node
{
int key,val;
Node *left, *right;
Node(int _key, int _val):key(_key),val(_val),left(NULL),right(NULL){}
}*L,*R;
int n;
unordered_map<int, Node*> hash;
void InitLRU(int capacity)
{
n = capacity;
L = new Node(-1,-1);
R = new Node(-1,-1);
L->right = R;
R->left = L;
}
void remove(Node *p)
{
// p 在 p->left 和 p->right 之间
p->right->left = p->left;
p->left->right = p->right;
}
void insert(Node *p)
{
// L 和 L->right 之间插入 p
p->right = L->right;
p->left = L;
L->right->left = p;
L->right = p;
}
int get(int key)
{
if (hash.count(key) == 0)
return -1;
auto p = hash[key];
remove(p);
insert(p);
return p->val;
}
void set(int key, int value)
{
if (hash.count(key))
{
auto p = hash[key];
remove(p);
insert(p);
p->val = value;
}
else
{
if (hash.size() == n)
{
auto p = R->left;
remove(p);
hash.erase(p->key);
delete p;
}
auto p = new Node(key, value);
insert(p);
hash[key] = p;
}
}
vector<int> LRU(vector<vector<int> >& operators, int k) {
vector<int> res;
InitLRU(k);
for (int i = 0; i < operators.size(); ++i)
{
if (operators[i][0] == 1)
set(operators[i][1],operators[i][2]);
else if (operators[i][0] == 2)
res.push_back(get(operators[i][1]));
}
return res;
}
}; 

