双向链表+哈希表,哈希表的目的是为了实现O(1)的时间复杂度。另外要注意的就是在set和get过程中要同时维护双向链表和哈希表。

class Solution {
public:
    /**
     * lru design
     * @param operators int整型vector<vector<>> the ops
     * @param k int整型 the k
     * @return int整型vector
     */
    void set(int key,int value){
        auto iter=k_iter.find(key);
        if(iter!=k_iter.end()){
            kv_list.erase(k_iter[key]);
            kv_list.push_front({key,value});
            k_iter.insert({key,kv_list.begin()});
        }
        else{
            if(kv_list.size()>=capacity){
                k_iter.erase(kv_list.back().first);
                kv_list.pop_back();
            }
            kv_list.push_front({key,value});
            k_iter.insert({key,kv_list.begin()});
        }
    }
    
    int get(int key){
        int val{-1};
        auto iter=k_iter.find(key);
        if(iter==k_iter.end()){ //不存在
            return val;
        }
        else{ //存在
            val=iter->second->second;
            kv_list.erase(iter->second);
            kv_list.push_front({key,val});
            k_iter[key]=kv_list.begin();
        }
        return val;
    }
    
    vector<int> LRU(vector<vector<int> >& operators, int k) {
        // write code here
        vector<int> result{};
        if(k==0){
            return result;
        }
        capacity=k;
        for(auto x : operators){
            if(x[0]==1){
                set(x[1],x[2]);
            }
            else{
                result.push_back(get(x[1]));
            }
        }
        return result;
    }
private:
    int capacity;
    list<pair<int,int>> kv_list;
    unordered_map<int,list<pair<int,int>>::iterator> k_iter; //保存key对应元素的位置
};