146. LRU 缓存
代码
ts
class LRUCache {
capacity: number;
map: Map<number, number>;
constructor(capacity: number) {
this.capacity = capacity;
this.map = new Map();
}
get(key: number): number {
const val = this.map.get(key);
if (this.map.has(key)) {
this.map.delete(key);
this.map.set(key, val);
return val;
}
else {
return -1;
}
}
put(key: number, value: number): void {
if(this.map.has(key)){
this.map.delete(key);
}
else if (this.map.size >= this.capacity) {
this.map.delete(this.map.keys().next().value);
}
this.map.set(key, value);
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* var obj = new LRUCache(capacity)
* var param_1 = obj.get(key)
* obj.put(key,value)
*/思路
使用 Map 实现 LRU(Least Recently Used)缓存:
核心思想
利用 JavaScript 的 Map 数据结构的特性:
- Map 会按照插入顺序维护键值对
- 最早插入的键值对在最前面,最新插入的在最后面
get 操作
- 检查 key 是否存在
- 如果存在:
- 删除旧的键值对
- 重新插入(移到最后,表示最近使用)
- 返回值
- 如果不存在,返回 -1
put 操作
- 如果 key 已存在:
- 删除旧的键值对(为了更新位置)
- 如果 key 不存在且缓存已满:
- 删除最早插入的键值对(
map.keys().next().value获取第一个 key)
- 删除最早插入的键值对(
- 插入新的键值对(自动放在最后)
关键点
利用 Map 的插入顺序特性实现 LRU
map.keys().next().value获取第一个(最久未使用的)key通过删除再插入来更新访问顺序
时间复杂度:get 和 put 操作都是
空间复杂度