力扣面试150(55/150)

8.13 146. LRU 缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。

实现 LRUCache 类:

  • LRUCache(int capacity)正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 getput 必须以 O(1) 的平均时间复杂度运行。

我的思路:因为这个是链表专题里面的,所以一直在思考怎么用链表写,一直没有思考出来撒,然后我就觉得map也很合适,我就用的map。

初始化:初始化限定的长度以及一个map

get:如果链表里面没有->返回-1,有的话就要先删除它,再set它,记得返回,因为map是有序的,set是插入到末尾

put:put的话也要看是否有值,有->删除+set,没有的话要判断长度,如果长度超过了限定长度的话就要进行删除操作,删除的就是第一个

复制代码
this.cache.keys().next().value; //获取第一个的值

我的代码:

复制代码
var LRUCache = function(capacity) {
    this.len = capacity;
    this.cache = new Map();
};

/** 
 * @param {number} key
 * @return {number}
 */
LRUCache.prototype.get = function(key) {
    // 如果没有的话就返回-1
    if(!this.cache.has(key)){
        return -1;
    }else {
        const temp = this.cache.get(key);
        // 有的话需要放在最顶端而且返回值
        this.cache.delete(key);
        this.cache.set(key,temp);
        return temp;
    }
};

/** 
 * @param {number} key 
 * @param {number} value
 * @return {void}
 */
LRUCache.prototype.put = function(key, value) {
    // put要看有没有值,有值的话要改变顺序加改变值
    if(this.cache.has(key)){
        // 如果有这个值
        // 先删除旧的
        this.cache.delete(key);
    }else {
        // 没有这个值
        if(this.cache.size >= this.len){
             const firstKey = this.cache.keys().next().value;
            
            // 删除最久未使用的项
            this.cache.delete(firstKey);
        }
    }
     this.cache.set(key, value);
};

总结:

这段代码实现了一个 LRU(最近最少使用)缓存机制,使用 Map 来存储键值对并利用其有序性来追踪访问顺序。在 get 操作中,如果 key 存在,会先删除再重新插入该键值对,以更新其访问顺序,然后返回值;如果不存在则返回 -1。在 put 操作中,如果 key 已存在,会先删除旧项再插入新值以更新顺序;如果 key 不存在且缓存已满,会删除 Map 中第一个最久未使用的项,然后再插入新数据。这样保证了缓存容量不超过设定值,同时总是淘汰最久未使用的数据。