题解 | #设计LRU缓存结构#

设计LRU缓存结构

http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61

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
        // 使用list来维护LRU缓存
        // 使用哈希表提高查询速度
        list<pair<int, int>> lru_list;
        unordered_map<int, list<pair<int, int>>::iterator> mil; // 直接存储list的迭代器,减少list的查询
        vector<int> res;
        
        // 使用新特性auto
        for (auto op : operators) {
            // set or get
            switch(op[0]) {
                // set
                case 1: {
                    // 插入一个值,这个值可能出现过也可能没有出现过
                    auto it = mil.find(op[1]);
                    if (it != mil.end()) { // 已经在缓存中
                        // 删除list中原来的节点,插入新节点到最前面
                        lru_list.erase(it->second);
                        // 再set新值在最前面
                        lru_list.push_front(make_pair(op[1], op[2]));
                        // 更改map为对应的list节点
                        it->second = lru_list.begin();
                    } else { // 没有在缓存中
                        // 缓存以满,需要先删除最后的节点
                        if (lru_list.size() == k) {
                            // map也要删除
                            mil.erase(lru_list.back().first);
                            lru_list.pop_back();
                        }
                        // 新节点加入
                        lru_list.push_front(make_pair(op[1], op[2]));
                        mil.insert({op[1], lru_list.begin()});
                    }
                } break;
                // get
                case 2: {
                    auto it = mil.find(op[1]);
                    if (it != mil.end()) {
                        // 在缓存中,查找结果加入res中
                        int num = it->second->second;
                        res.push_back(num);
                        // 更新缓存位置
                        lru_list.erase(it->second);
                        lru_list.push_front(make_pair(op[1], num));
                        // 更新map
                        it->second = lru_list.begin();
                    } else {
                        res.push_back(-1);
                    }
                } break;
            }
        }
        return res;
        
    }
};
全部评论

相关推荐

10-25 12:05
已编辑
湖南科技大学 Java
若梦难了:我有你这简历,已经大厂乱杀了
点赞 评论 收藏
分享
霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务