解题思路
- 键值对的查询,首选 map。又因为本题中 map 只是用来查询,不涉及排序,所以采用 unordered_map
- 维护最近使用的元素,这涉及了出队和入队的概念,但因为 queue 只能操作头部和尾部的元素,所以不适用于本题。而 list 既满足了对头/尾元素的操作,也可以对中间元素进行删除操作,所以选用 list。
- list 中只需要维护 map 中的键值就足够了,不需要维护 pair<key, value>
代码
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) {
if (operators.empty())
return vector<int>();
vector<int> ret;
for (auto& o : operators) {
if (o[0] == 1)
set(o[1], o[2], k);
else if (o[0] == 2)
get(o[1], ret);
}
return ret;
}
private:
unordered_map<int, int> map;
list<int> keys;
void set(int key, int value, int k) {
if (keys.size() == k) {
int delKey = keys.back();
keys.pop_back();
map.erase(delKey);
}
map[key] = value;
keys.push_front(key);
}
void get(int key, vector<int>& ret) {
auto found = map.find(key);
if (found == map.end()) {
ret.push_back(-1);
} else {
ret.push_back(found->second);
keys.remove(found->first);
keys.push_front(found->first);
}
}
};