#146
Medium
双指针

LRU Cache

设计支持 O(1) get / put 的 LRU 缓存。

DesignHash Table

题目定位

它真正的模式是哈希表 + 双向链表。这里放在双指针相关族里,是因为面试官常借它考察你是否能稳定维护指针和顺序不变式。

关键观察

链表负责维护最近使用顺序,哈希表负责 O(1) 找到需要移动的节点。

目标复杂度

O(1) / O(capacity)

这题的解法思路怎么拆

1

它真正的模式是哈希表 + 双向链表。这里放在双指针相关族里,是因为面试官常借它考察你是否能稳定维护指针和顺序不变式。

2

链表负责维护最近使用顺序,哈希表负责 O(1) 找到需要移动的节点。

3

先定义两个指针各自代表什么,再考虑怎么移动。

4

用当前比较结果证明哪一侧可以被安全丢弃。

参考实现

Python
# Generic pattern template
# Opposite-direction pointers on a sorted array
left, right = 0, len(nums) - 1
while left < right:
    if good(nums[left], nums[right]):
        return answer
    if should_move_left(nums[left], nums[right]):
        left += 1
    else:
        right -= 1

# Fast/slow pointers
slow = 0
for fast in range(len(nums)):
    if keep(nums[fast]):
        nums[slow] = nums[fast]
        slow += 1

常见坑点

warning

用普通队列实现,结果没法 O(1) 删除中间节点。

warning

删除或插入节点时只更新了单侧指针。

高频追问

为什么必须是双向链表?

如果换成 LFU,结构要怎么变?

继续刷相关题

先把 双指针 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 146. LRU Cache 题解思路 | Interview AiBox