《Valheim英靈神殿》室內裝潢佈置參考
阿新 • • 發佈:2021-02-27
題目描述
設計LRU快取結構,該結構在構造時確定大小,假設大小為K,並有如下兩個功能
- set(key, value):將記錄(key, value)插入該結構
- get(key):返回key對應的value值
[要求]
- set和get方法的時間複雜度為O(1)
- 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。
- 當快取的大小超過K時,移除最不經常使用的記錄,即set或get最久遠的。
若opt=1,接下來兩個整數x, y,表示set(x, y)
若opt=2,接下來一個整數x,表示get(x),若x未出現過或已被移除,則返回-1
對於每個操作2,輸出一個答案
示例1
輸入
[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3
返回值
[1,-1]
說明
第一次操作後:最常使用的記錄為("1", 1) 第二次操作後:最常使用的記錄為("2", 2),("1", 1)變為最不常用的 第三次操作後:最常使用的記錄為("3", 2),("1", 1)還是最不常用的 第四次操作後:最常用的記錄為("1", 1),("2", 2)變為最不常用的 第五次操作後:大小超過了3,所以移除此時最不常使用的記錄("2", 2),加入記錄("4", 4),並且為最常使用的記錄,然後("3", 2)變為最不常使用的記錄
備註:
每一次是個3元組或者是2元組,{1,2,3],第一個元素1表示是set操作,{2,3}這裡的第一個元素2表示get操作。
class Solution { public: /** * lru design * @param operators int整型vector<vector<>> the ops * @param k int整型 the k * @return int整型vector */ vector<int> LRU(vector<vector<int> >& operators, int k) { vector<int> key; vector<int> value; vector<int> res; for(int i=0;i<operators.size();++i) { if(operators[i][0]==1)//set操作 { set(operators[i][1],operators[i][2],key,value,k); } else { get(operators[i][1],key,value,res); } } return res;//返回值別忘了 } //set就是設定(key,value),能放就壓入,放不下就把頭的刪除出去,調整是get的要做的事,set不用管那麼多 void set(int k,int v,vector<int>&key,vector<int>&value,int&Knum) { if(key.size()<Knum) { key.emplace_back(k); value.emplace_back(v); } else { key.erase(key.begin()); value.erase(value.begin()); key.emplace_back(k); value.emplace_back(v); } } void get(int k,vector<int>&key,vector<int>&value,vector<int>&res) {//get需要把這次用到的頁面調整到最後面的位置 int pos=-1; for(int i=0;i<key.size();++i) { if(key[i]==k) { pos=i; break; } } if(pos==-1) { res.emplace_back(-1); } else { int tmpKey=key[pos],tmpValue=value[pos];//先臨時記錄下來再刪除 key.erase(key.begin()+pos); value.erase(value.begin()+pos); key.emplace_back(tmpKey); value.emplace_back(tmpValue); res.emplace_back(tmpValue); } } };