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部分需要额外存入一个双链表的迭代器以便直接获取元素位置