146.LRU缓存
这道题是leecode hot100的第146题
难度: 中等
题目:
-
实现一个
LRUCache类型,用来充当存储空间 -
采用 Map 数据结构存储数据,因为它的存取时间复杂度为
O(1),数组为O(n) -
实现
get和set方法,用来获取和添加数据 -
我们的存储空间有长度限制,所以无需提供删除方法,存储满之后,自动删除最久远的那条数据
-
当使用
get获取数据后,该条数据需要更新到最前面
思路分析: 要理解需求是什么意思! 构建一个对象,它的空间是有限的,
我们使用len来表示它最大的额度, 存储数据结构就用Map, js中的map是有序的,实现起来更简单
需要两个方法, 一个get() ,读取缓存中的数据;一个set(), 添加缓存数据
但是我们要做到LRU缓存的要求, 需要手动设置一些读取和添加的细节
读取时, 调用get(key), 如果这个键不存在map中,返回null, 若存在,则记录下来值value=data.get(key), 删除原有的键值对 , 在后面新增一条键值对, data.set(key,value)
存入时, 调用set(key,value), 如果存在key这个键, 删除键值对, 再新增, 如果没有就在末尾新增一条记录, 还没完, 如果新增之后缓存记录超过最大值了,那不行, 所有我们需要判断一下data.size有没有超过最大值len, 超过了就删除第一个缓存记录
题解语言: js
题解
/**
* @param {number} capacity
*/
var LRUCache = function (capacity) {
this.len = capacity;
this.data = new Map();
};
/**
* @param {number} key
* @return {number}
*/
LRUCache.prototype.get = function (key) {
// 先看data里面有没有
const data = this.data;
if (!data.has(key)) {
return -1;
}
const value = data.get(key);//先获取值
data.delete(key);
data.set(key, value);
return value; // 必须返回值!
};
/**
* @param {number} key
* @param {number} value
* @return {void}
*/
LRUCache.prototype.put = function (key, value) {
const data = this.data;
if (data.has(key)) {
data.delete(key);
}
data.set(key, value);
if (data.size > this.len) {
// 删除第一个
const delKey = data.keys().next().value;
data.delete(delKey);
}
};