代码
注意:并非要求我们一定在O(1)的时间复杂度完成set和get操作!
class Solution {
private:
vector<pair<int,int>> data;
int maxSize;
vector<int> res;
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) {
// write code here
//若opt=1,接下来两个整数x, y,表示set(x, y)
//若opt=2,接下来一个整数x,表示get(x),若x未出现过或已被移除,则返回-1
//对于每个操作2,输出一个答案
//某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。
//当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。
//进阶:set和get方法的时间复杂度为O(1)
//我不进阶行了吧
maxSize = k;
for(int i = 0; i < operators.size(); i++)
{
vector<int> t = operators[i];
if(t[0] == 1)//set方法:将记录(key, value)插入该结构
{
int x = t[1], y = t[2];
set(x, y);
}
else if(t[0] == 2)//get方法:返回key对应的value值 对于每个操作2,输出value值
{
int x = t[1];
get(x);
}
}
return res;
}
void set(int x, int y)
{
//检查data中有没有(x,y)
int index = 0;
int flag = false;
for(auto t : data)
{
if(t.first == x)
{
flag = true;
break;
}
index ++;
}
if(flag == false)
data.push_back({x,y});
else
{
//删除data中第index个数据
auto it = data.begin() + index;
data.erase(it);
data.push_back({x,y});
}
if(data.size() > maxSize)//超容量了,删除第1个元素
data.erase(data.begin());
}
void get(int x)
{
int val = -1;
int index = 0;
for(auto t : data)
{
if(t.first == x)
{
val = t.second;
break;
}
index++;
}
res.push_back(val);
if(val != -1)
{
data.erase(data.begin() + index);
data.push_back({x, val});
}
}
};