https://leetcode.cn/problems/lru-cache/
题目有key、value的,直接就上map了
结果:😅
仔细一看,原来要 get 和 put 必须 O(1)
只能抛弃树型数据结构了
线性的数据结构也可以吧,如果可以构造出一个队列,从前往后放入;如果访问,把访问的那个拿出来放后面;如果满了,把最前面的那个踢出去;如果更新,把更新的那个放最后面
- 从前往后放入:queue
- 如果访问,把访问的那个拿出来放后面:放后面queue能实现,但是找到那个访问的,暴力O(n),如果是用map就是O(logn),没到O(1)
- 如果满了,把最前面的那个踢出去:queue
- 如果更新,把更新的那个放最后面:跟2一样,问题在找不着
能在O(1)找到元素的数据结构是哈希表
哈希表是unordered_map
我自己写这题的时候负优化,想着可以在队列中存一些脏数据,等到用到的时候再判断这个数据脏不脏。但其实,这个判断也是要时间的,不如直接维护真实数据
看到题解有人用list,list的话是链式结构,插入O(1),删除O(1),查询O(n),刚开始我想,删除不用找到对应的那个么?这样又O(n)了?其实是不用的,如果是自己实现的话
void removeNode(DLinkedNode* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}
这个node是一个指针,这个指针是unordered_map给的,而不是迭代list找到的,那就O(1)