牛客网 | 高频面试题 | 设计LRU缓存结构

文章目录

题目

设计LRU缓存结构_牛客网

示例1
	输入
		[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3
	返回值
		[1,-1]
说明
	第一次操作后:最常使用的记录为("1", 1)
	第二次操作后:最常使用的记录为("2", 2)("1", 1)变为最不常用的
	第三次操作后:最常使用的记录为("3", 2)("1", 1)还是最不常用的
	第四次操作后:最常用的记录为("1", 1)("2", 2)变为最不常用的
	第五次操作后:大小超过了3,所以移除此时最不常使用的记录("2", 2),加入记录("4", 4),并且为最常使用的记录,然后("3", 2)变为最不常使用的记录

解析

class Solution {
private:
public:
    /**
     * lru design
     * @param operators int整型vector<vector<>> the ops,操作数
     * @param k int整型 the k ,LRU缓存大小为k
     * @return int整型vector
     */
    int capacity;
    list<pair<int,int>> lrulst;//链表
    //list<pair<int,int>>::iterator 指向里面的元素
    unordered_map<int,list<pair<int,int>>::iterator > lruhash;//map
    vector<int> LRU(vector<vector<int> >& operators, int k) {
        // write code here
        vector<int> res;
        capacity = k;
        for(auto opt : operators){
            switch (opt[0]){
                case 1:
                    set(opt[1],opt[2]);
                    break;
                case 2:
                    res.push_back(get(opt[1]));
                    break;
                default:
                    break;
            }
        }
        return res;
    }
    void set(int key,int val){
        auto iter = lruhash.find(key);
        //判断是否存在
        if(iter == lruhash.end()) 
        {
            //如果容积满了
            if(capacity == lrulst.size())
            {
                //删掉最末元素
                lruhash.erase(lrulst.back().first);
                lrulst.pop_back();
            }
        }
        else    lrulst.erase(iter->second);//删掉更新一下
        //更新
        lrulst.push_front({key,val});
        lruhash[key] = lrulst.begin();
    }
    int get(int key){
        auto iter = lruhash.find(key);
        if(iter == lruhash.end())    return -1;
        int val = iter->second->second;
        //删掉链表节点,再重新添加
        lrulst.erase(iter->second);
        lrulst.push_front(*iter->second);
        return val;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值