牛客 NC93 - 设计LRU缓存结构

设计LRU缓存结构_牛客题霸_牛客网

设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能

1. set(key, value):将记录(key, value)插入该结构

2. get(key):返回key对应的value值

提示:

1.某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的,然后都会刷新缓存。

2.当缓存的大小超过K时,移除最不经常使用的记录。

3.输入一个二维数组与K,二维数组每一维有2个或者3个数字,第1个数字为opt,第2,3个数字为key,value

   若opt=1,接下来两个整数key, value,表示set(key, value)
   若opt=2,接下来一个整数key,表示get(key),若key未出现过或已被移除,则返回-1
   对于每个opt=2,输出一个答案

4.为了方便区分缓存里key与value,下面说明的缓存里key用""号包裹

题解:

定义一个队列q,在每一次操作后将此时最高优先级的key值入队。

定义可重集ms,在每一次操作后和q中的元素保持一致。

定义map,m中记录每一个key和当前与之对应的value。

定义一个计数器len,记录当前在缓存结构中不同的key的个数。

当opt=1,即执行set(key, value)操作时,在map中插入m[key] = value,并在可重集ms中查找是否存在该key值,若不存在则将可重集中不同key值的数量+1(len++)。

每一次set(key, value)操作后将该key值插入可重集中,并插入队列q。

当不同key值的数量大于LRU的大小时(len > k),在可重集ms中持续删除此时在队列q队首的元素,并将队首元素出队。若此时ms中不存在该队首元素,则len--。直到len不大于k时停止。

当opt=2,即执行get(key)操作时,首先在可重集中查找是否存在该key值,若不存在则返回结果为-1。若存在则返回结果为m[key],将此key值插入可重集并插入队尾。

class Solution {
public:
    /**
     * lru design
     * @param operators int整型vector<vector<>> the ops
     * @param k int整型 the k
     * @return int整型vector
     */
    
    vector<int> LRU(vector<vector<int> >& operators, int k) {
        // write code here
        map<int,int> m;
        queue<int> q;
        vector<int> res;
        int key , len = 0, temp;
        multiset<int> ms;
        for(int i = 0 ; i < operators.size() ; i++){
            if(operators[i][0] == 1){
                m[ operators[i][1] ] = operators[i][2];
                if(ms.find(operators[i][1]) == ms.end()){
                    len++;
                    //res.push_back(101);
                }
                ms.insert(operators[i][1]);
                q.push(operators[i][1]);
                while(len > k){
                    temp = q.front();
                    //res.push_back(1000*temp);
                    ms.erase(ms.find(temp));
                    q.pop();
                    if(ms.find(temp) == ms.end()){
                        len--;
                        //res.push_back(102);
                    }
                }
            }
            
            if(operators[i][0] == 2){
                key = operators[i][1];
                if(ms.find(key) == ms.end()) res.push_back( -1);
                else{
                    res.push_back( m[key] );
                    q.push(operators[i][1]);
                    ms.insert(operators[i][1]);
                }
            }
        }
        return res;
    }
};

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值