链接: https://leetcode-cn.com/problems/lru-cache/description/
题意
请你设计并实现一个满足 LRU (最近最少使用)缓存约束的数据结构
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行
解法一
要求设计一个这样的数据结构 可以维护最久未访问的一个队列
我一开始想到的是用一个双向队列 队列尾放最新的 队列头放最久未使用的
同时需要记录当前数的有没有被放到队尾 以处理后序需要删除队头元素
挺麻烦的 但是最终也实现了
代码
1 | class LRUCache { |
解法二
但是上面的解法可能存在大量冗余值 且可能在删除最久未使用的值的时候产生无效开销
需要找到一个更好的数据结构 可以维护最久未访问的一个队列
同时需要把最新访问的节点放到最前面
数组无法实现在O(1)时间内完成这样的操作 因为每次移动需要调整整个数组 时间复杂度接近O(n)
比较直观的想法是用到map,可以根据key的值在O(1)或者O(logn)时间内访问到元素
考虑到需要修改线性表的顺序 用链表是最好的
因为链表可以在O(1)完成节点的添加和删除 很好的满足了题目的要求
最终确定数据结构unordered_map + 双向链表
然后就是实现的过程了
双向链表需要实现一个将元素添加到头部,删除任一节点,删除尾节点这几个方法
同时添加链表头节点和尾节点 便于节点操作处理
代码
1 | class Node { // 双向链表节点 |