C++ List+哈希表实现,无需实现链表的操作
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
哈希表保存key到Node的映射,list维护双向链表,代码简练
class Solution {
public:
/**
* lru design
* @param operators int整型vector<vector<>> the ops
* @param k int整型 the k
* @return int整型vector
*/
struct Node {
int key;
int val;
Node(int k, int v) : key(k), val(v) {}
};
unordered_map<int, Node*> mp;
list<Node*> sorted_list;
int max_size = 0;
void set(int key, int value) {
Node* node = new Node(key, value);
// 链表满了,需要删除元素
if(sorted_list.size() == max_size) {
//删除链表尾结点和哈希表映射
Node* tmp = sorted_list.back();
mp.erase(tmp->key);
sorted_list.pop_back();
}
mp[key] = node;
sorted_list.push_front(node);
}
int get(int key) {
if(mp.count(key)) {
// 访问过,把节点提到最前
Node* cur = mp[key];
sorted_list.remove(cur);
sorted_list.push_front(cur);
return cur->val;
}
return -1;
}
vector<int> LRU(vector<vector<int> >& operators, int k) {
// write code here
vector<int> res;
max_size = k;
for(vector<int>& op : operators) {
if(op[0] == 1) {
set(op[1], op[2]);
}
else if(op[0] == 2) {
//cout << get(op[1]) << endl;
res.push_back(get(op[1]));
}
}
return res;
}
};
查看15道真题和解析
