题解 | #设计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-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务