使用双向链表和哈希表实现 O(1) 时间复杂度
class Solution {
public:
Solution(int capacity) : lru(capacity), cap(capacity) {
}
int get(int key) {
if (hash.count(key)) {
auto tmp = *(hash[key]);
lru.erase(hash[key]);
lru.push_front(tmp);
hash[key] = lru.begin();
return tmp.second;
}
return -1;
}
void set(int key, int value){
if (hash.count(key)) {
lru.erase(hash[key]);
}
if (lru.size() >= cap) {
auto tmp = lru.back();
hash.erase(tmp.first);
lru.pop_back();
}
lru.push_front({key, value});
hash[key] = lru.begin();
}
private:
int cap;
// 使用to_string返回转换(由平台内部实现)
std::list<std::pair<int, int>> lru;
// 键映射到指定的迭代器
std::unordered_map<int, std::list<std::pair<int, int>>::iterator> hash;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* solution = new Solution(capacity);
* int output = solution->get(key);
* solution->set(key,value);
*/
更新写法
class Solution {
public:
Solution(int capacity) {
cap = capacity;
}
int get(int key) {
if (hash.count(key)) {
int val = hash[key]->second;
lru.erase(hash[key]);
lru.push_front({key, val});
hash[key] = lru.begin();
return val;
} else {
return -1;
}
}
void set(int key, int value){
if (hash.count(key)) {
lru.erase(hash[key]);
} else if (lru.size() >= cap) {
hash.erase(lru.back().first);
lru.pop_back();
}
lru.push_front({key, value});
hash[key] = lru.begin();
}
private:
int cap;
std::list<std::pair<int, int>> lru;
std::unordered_map<int, std::list<std::pair<int, int>>::iterator> hash;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* solution = new Solution(capacity);
* int output = solution->get(key);
* solution->set(key,value);
*/

京公网安备 11010502036488号