#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在常数时间内找到双向链表中对应的位置。