#include <list>
#include <unordered_map>
class Solution {
using List = list<pair<int, int>>;
List lists;
unordered_map<int, List::iterator> hash;
int size;
public:
Solution(int capacity){
size = capacity;
}
int get(int key) {
if (hash.count(key)) {
int res = (*(hash[key])).second;
lists.erase(hash[key]);
lists.emplace_front(key, res);
hash[key] = lists.begin();
return res;
} else {
return -1;
}
}
void set(int key, int value){
if (hash.count(key)) {
lists.erase(hash[key]);
}
lists.emplace_front(key, value);
hash[key] = lists.begin();
if (lists.size() > size) {
int erase_key = lists.back().first;
lists.erase(hash[erase_key]);
hash.erase(erase_key);
}
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* solution = new Solution(capacity);
* int output = solution->get(key);
* solution->set(key,value);
*/
思路:
* 双向链表表示k-v插入的顺序。
* 哈希表根据key在常数时间内找到双向链表中对应的位置。

京公网安备 11010502036488号