算法挑战8

2 阅读2分钟

146.LRU缓存

这道题是leecode hot100的第146题

难度: 中等

题目:

  • 实现一个 LRUCache 类型,用来充当存储空间

  • 采用 Map 数据结构存储数据,因为它的存取时间复杂度为 O(1),数组为 O(n)

  • 实现 getset 方法,用来获取和添加数据

  • 我们的存储空间有长度限制,所以无需提供删除方法,存储满之后,自动删除最久远的那条数据

  • 当使用 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);
    }
};