一.原题如下:
二.解题思路
- 使用3个哈希表,KV、KF、FK分别存储key-value键和值映射、key-frequently键和频次映射,frequently-keys频次和键集合映射。
- 其中两个函数需要额外注意:增加访问频率函数和移除最小频率函数,增加访问频率函数需要同时增加KF和FK表;移除最小频率函数需要同时移除FK、KF、和KV这三个表。
- 以上两个函数中,涉及到移除FK表时,都需要判断键集合是否为空,如果为空需要手动进行删除。
- put()函数需要额外注意三个点:判断key是否已经存在;判断缓存大小是否已经超过缓存容量;最后需要设置KF表、FK表、最小频率的默认值为1。
- get()函数需要额外注意两点个:判断key是否不存在;需要调用增加访问频率函数。
三.完整题解
具体步骤请查看每个关键步骤的代码注释
public class LFUCache {
HashMap<Integer, Integer> kv;
HashMap<Integer, Integer> kf;
HashMap<Integer, LinkedHashSet<Integer>> fk;
int minFrequently;
int capacity;
public LFUCache(int capacity) {
this.minFrequently = 0;
this.capacity = capacity;
this.kv = new HashMap<>(