leetcode 460
题目描述
460. LFU 缓存
请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。
实现 LFUCache
类:
LFUCache(int capacity)
- 用数据结构的容量capacity
初始化对象int get(int key)
- 如果键key
存在于缓存中,则获取键的值,否则返回-1
。void put(int key, int value)
- 如果键key
已存在,则变更其值;如果键不存在,请插入键值对。当缓存达到其容量capacity
时,则应该在插入新项之前,移除最不经常使用的项。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除 最近最久未使用 的键。
为了确定最不常使用的键,可以为缓存中的每个键维护一个 使用计数器 。使用计数最小的键是最久未使用的键。
当一个键首次插入到缓存中时,它的使用计数器被设置为 1
(由于 put 操作)。对缓存中的键执行 get
或 put
操作,使用计数器的值将会递增。
函数 get
和 put
必须以 O(1)
的平均时间复杂度运行。
示例:
1 |
|
解题思路
- 哈希表+linkedHashSet:通过三个结构来存储当前情况,
- key2Val 用来存放key对应的value
- key2Freq 用来存放key出现的频率
- freq2keys 用来存放频率对应的key的列表。因为在频率相同的情况下,需要抛弃最久未使用的,因此需要用有序的结构存储,而且需要O(1)的时间复杂度,因此LinkedHashSet最合适。
- 整体思路不难,但很多细节,因为要操作很多数据表,CPU快给我干烧了
执行用时:69 ms, 在所有 Java 提交中击败了41.72%的用户
内存消耗:122.7 MB, 在所有 Java 提交中击败了45.30%的用户
通过测试用例:25 / 25
时间 O(n)
空间 O(n)
1 |
|
leetcode 460
https://kkkkkong.github.io/posts/23803.html