struct node{
int cnt;//使用的次数
int time;//最近使用的时间
int key;
int value;
node(int _cnt,int _time,int _key,int _value):cnt(_cnt),time(_time),key(_key),value(_value){}
bool operator < (const node &x)const{
return cnt == x.cnt ? time < x.time : cnt < x.cnt;
}
};
class LFUCache {
public:
int capacity;
int time;
unordered_map<int,node>key_map;
set<node>s;
LFUCache(int _capacity) {
capacity = _capacity;
time = 0;
s.clear();
key_map.clear();
}
int get(int key) {
if(capacity == 0)
return -1;
auto it = key_map.find(key);
if(it == key_map.end())
return -1;
node temp = it -> second;
s.erase(temp);
temp.cnt++;
temp.time = ++time;
s.insert(temp);
it -> second = temp;
// key_map[key] = temp;
return temp.value;
}
void put(int key, int value) {
if(capacity == 0)
return;
auto it = key_map.find(key);
if(it == key_map.end())//没有
{
if(s.size() == capacity)//满了
{
auto temp = s.begin();
key_map.erase(s.begin()->key);
s.erase(s.begin());
}
node temp = node(1,++time,key,value);
s.insert(temp);
key_map.insert(make_pair(key,temp));
}
else
{
node temp = it -> second;
s.erase(temp);
temp.cnt++;
temp.time = ++time;
temp.value = value;
s.insert(temp);
// key_map[key] = temp;
it -> second = temp;
}
}
};
/**
* Your LFUCache object will be instantiated and called as such:
* LFUCache* obj = new LFUCache(capacity);
* int param_1 = obj->get(key);
* obj->put(key,value);
*/