https://leetcode-cn.com/problems/lfu-cache/submissions/
方法一:哈希 + 平衡樹
時間複雜度:get 時間複雜度 O(logn),put 時間複雜度 O(logn)
空間複雜度:O(capacity)
struct node{
int key,value,cnt,time;
node(int _key,int _value,int _cnt,int _time):key(_key),value(_value),cnt(_cnt),time(_time){}
bool operator < (const node &x) const {
return cnt == x.cnt ? time < x.time : cnt < x.cnt;
}
};
class LFUCache {
public:
unordered_map<int,node> m;
set<node> s;
int capacity,time;
LFUCache(int _capacity) {
capacity = _capacity;
m.clear();
s.clear();
time = 0;
}
int get(int key) {
if(capacity == 0) return -1;
auto it = m.find(key);
if(it == m.end()) return -1;
node cache = it->second;
s.erase(cache);
cache.time = ++time;
++ cache.cnt;
s.insert(cache);
it->second = cache;
//m[key] = cache;
return cache.value;
}
void put(int key, int value) {
if(capacity == 0) return ;
auto it = m.find(key);
if(it == m.end()){
if(s.size() == capacity){
m.erase(s.begin()->key);
s.erase(s.begin());
}
node cache = node(key,value,1,++time);
s.insert(cache);
m.insert(make_pair(key,cache));
}else{
node cache = it->second;
s.erase(cache);
cache.time = ++time;
++ cache.cnt;
cache.value = value;
s.insert(cache);
it->second = cache;
//m[key] = cache;
}
}
};
/**
* 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);
*/