设计LRU缓存结构

设计LRU缓存结构

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

解题思路

  • 键值对的查询,首选 map。又因为本题中 map 只是用来查询,不涉及排序,所以采用 unordered_map
  • 维护最近使用的元素,这涉及了出队和入队的概念,但因为 queue 只能操作头部和尾部的元素,所以不适用于本题。而 list 既满足了对头/尾元素的操作,也可以对中间元素进行删除操作,所以选用 list。
  • list 中只需要维护 map 中的键值就足够了,不需要维护 pair<key, value>

代码

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) {
        if (operators.empty())
            return vector<int>();

        vector<int> ret;
        for (auto& o : operators) {
            if (o[0] == 1)
                set(o[1], o[2], k);
            else if (o[0] == 2)
                get(o[1], ret);
        }
        return ret;
    }

private:
    unordered_map<int, int> map;
    list<int> keys;

    void set(int key, int value, int k) {
        if (keys.size() == k) {
            int delKey = keys.back();
            keys.pop_back();
            map.erase(delKey);
        }
        map[key] = value;
        keys.push_front(key);
    }

    void get(int key, vector<int>& ret) {
        auto found = map.find(key);
        if (found == map.end()) {
            ret.push_back(-1);
        } else {
            ret.push_back(found->second);
            keys.remove(found->first);
            keys.push_front(found->first);
        }
    }
};
全部评论
你的这个set里面是不是有个bug啊?不应该判断是不是存在一样的key吗?
4
送花
回复
分享
发布于 2021-03-24 12:42
remove的时间复杂度是线性的
1
送花
回复
分享
发布于 2021-09-27 14:54
秋招专场
校招火热招聘中
官网直投
为什么不可以直接就使用unOrdered_map实现呢?
点赞
送花
回复
分享
发布于 2021-07-08 16:59

相关推荐

祈求顺利毕业😁:简历很好了,多投吧牛油😂。主要是环境不好,大家也卷
点赞 评论 收藏
转发
15 收藏 评论
分享
牛客网
牛客企业服务