class Solution { public: Solution(int capacity) : m_capacity(capacity) {} int get(int key) { if (kv_pair.count(key) == 0) return -1; else { auto it = std::get<0>(kv_pair[key]); int val = std::get<1>(kv_pair[key]); lru_queue.erase(it); lru_queue.push_back(key); kv_pair[key] = {std::prev(lru_queue.end()), val}; return val; } } void set(int key, int value) { if (kv_pair.count(key) == 0) { lru_queue.push_back(key); kv_pair[key] = {std::prev(lru_queue.end()), value}; if (lru_queue.size() > m_capacity) { int key_remove = lru_queue.front(); kv_pair.erase(key_remove); lru_queue.pop_front(); } } else { auto it = std::get<0>(kv_pair[key]); lru_queue.erase(it); lru_queue.push_back(key); kv_pair[key] = {std::prev(lru_queue.end()), value}; } } private: unordered_map<int, pair<list<int>::iterator, int>> kv_pair; list<int> lru_queue; int m_capacity; };
确认三件事,这道题就不难,39行代码解决战斗:
LRU要求有序:某种有序数据结构
常数级别获取数据:哈希表
常数级别调换元素位置:链表
因此,选择哈希表作为key/value对,并且选择双链表代表顺序。哈希表的value部分需要额外存入一个双链表的迭代器以便直接获取元素位置