题意:


方法:
模拟

思路:
        利用数据结构 list 和 map 实现。
        重点:利用 list 模拟缓冲的大小和表示最近一次操作(get 或 set)。
                    list 的第一个元素表示最近一次的操作。
        
        遍历操作数组:
            1.get操作:
                    如果发现键存储,则返回对应的值,并且删除 list 对应的值,再重新将值加入list 的首部。
                    如果发现键不存在,则返回-1。

            2.set操作:
                    如果发现键存储,则修改对应的值,并且删除 list 对应的值,再重新将值加入list 的首部。
                    如果发现键不存在,则说明是插入新的值,这时又得判断 list (即缓冲)的大小:
                                    a.如果list 已满,则删除 list 的最后一个元素,并将新值加入 list 的首部;
                                    b.如果list 未满,则直接将新值加入 list 的首部。



	

class Solution {
	
public:     unordered_map<int,int> mp;//键值对     unordered_map<int,list<int>::iterator> mp2;//值到list地址的映射     list<int> ls;     int m;     vector<int> res;     vector<int> LRU(vector<vector<int> >& operators, int k) {         int n=operators.size();         m=k;         for(int i=0;i<n;i++){//遍历操作数组             if(operators[i][0]==1){                 set(operators[i][1],operators[i][2]);             }else{                 get(operators[i][1]);             }         }         return res;     }     void set(int x,int y){                  if(mp.count(x)){//重新赋值             mp[x]=y;
         // 删除原来的位置,得到最左的位置(最新)            
         ls.erase(mp2[x]);             ls.push_front(x);             mp2[x]=ls.begin();         }else{             mp[x]=y; // 无脑先插入             ls.push_front(x);             mp2[x]=ls.begin();             if(ls.size()>m){// 如果超过缓存大小,则删除末尾元素                 mp.erase(mp.find(ls.back()));                 mp2.erase(mp2.find(ls.back()));                 ls.pop_back();                          }         }     }          void get(int x){         if(mp.count(x)){//存在key             res.push_back(mp[x]);             //最近一次(头插法)
         // 删除原来的位置,得到最左的位置(最新)             ls.erase(mp2[x]);//删除指定值x             ls.push_front(x);//头插法             mp2[x]=ls.begin();//值到list地址的映射         }else{//不存在key             res.push_back(-1);         }     } };


时间复杂度:
空间复杂度: