题解 | #LFU缓存结构设计#
LFU缓存结构设计
http://www.nowcoder.com/practice/93aacb4a887b46d897b00823f30bfea1
class Solution {
public:
/**
* lfu design
* @param operators int整型vector<vector<>> ops
* @param k int整型 the k
* @return int整型vector
*/
struct Node {
int key;
int val;
int fre;
Node() {};
Node(int a,int b,int c):key(a),val(b),fre(c){}
};
unordered_map<int, list<Node>> fre; // 里面是频率的和对应频率的key值
unordered_map<int,list<Node>::iterator > site; // key对应的位置
int min_fre = -1; // 对应最小频率
int len;
void set(int key, int value) {
if(fre.empty()) {
min_fre=1;
fre[1].push_back(Node(key,value,1));
site[key]=--fre[1].end();
} else {
// 有数字
if(site.count(key)!=0) {
// 原来就有
auto iter = site[key];
auto node = *iter;
// 先删除原来的
fre[node.fre].erase(iter);
if(fre[node.fre].empty()) {
fre.erase(node.fre);
if(node.fre==1) {
min_fre=node.fre+1;
}
}
node.fre++;
node.val=value;
// 这边频率要往上移动
fre[node.fre].push_back(node);
site[node.key]=--fre[node.fre].end();
} else {
if(site.size()<len) {
// 直接插入
fre[1].push_back(Node(key,value,1));
min_fre=1;
site[key]=--fre[1].end();
} else {
// 删除一个
auto node = *fre[min_fre].begin();
fre[node.fre].pop_front();
site.erase(node.key);
if(fre[node.fre].empty()) {
fre.erase(node.fre);
}
// 开始插入
fre[1].push_back(Node(key,value,1));
min_fre=1;
site[key]=--fre[1].end();
}
}
}
}
int get(int key) {
if(site.count(key)==0){
return -1;
}
int res = site[key]->val;
// 开始换位置
auto node = *site[key];
fre[node.fre].erase(site[key]);
if(fre[node.fre].empty()) {
fre.erase(node.fre);
if(node.fre==1) {
min_fre=node.fre+1;
}
}
node.fre++;
fre[node.fre].push_back(node);
site[node.key]=--fre[node.fre].end();
return res;
}
vector<int> LFU(vector<vector<int> >& operators, int k) {
// write code here
vector<int> res;
len=k;
for(auto op : operators) {
if(op.size()==3) {
set(op[1],op[2]);
} else {
res.push_back(get(op[1]));
}
}
return res;
}
};
美的集团公司福利 722人发布