Я получаю ошибку времени выполнения в LeetCode, но это отлично работает в моей системе Linux за 0,046 пользовательского времени для самого большого тестового примера. Результат точно соответствует ожидаемому результату LeetCode. В моем решении используется хэш-карта и двусвязный список. В хэш-карте хранится итератор для узла связанного списка (в дополнение к паре ключ->значение), чтобы список можно было обновить O (1) вместо O (n). Он работает для нескольких тестовых наборов, но я получаю ошибку времени выполнения в тестовом наборе с размером кеша 512 и инструкциями 2019.
class LRUCache {
public:
LRUCache(int _capacity) { capacity = _capacity; }
int get(int key) {
if(hmap.find(key) == hmap.end()) return -1;
addq(key);
return hmap[key].first;
}
void put(int key, int value) {
list<int>::iterator ptr = addq(key);
hmap[key] = make_pair(value, ptr);
}
private:
list<int> q;
unordered_map<int, pair<int,list<int>::iterator>> hmap;
int capacity;
list<int>::iterator addq(int key) {
if(hmap.find(key) == hmap.end()) {
if(q.size() == capacity) {
int to_pop = q.back();
hmap.erase(to_pop);
q.pop_back();
}
}
else q.erase(hmap[key].second);
return q.insert(q.begin(), key);
}
};