用一个哈希表和一个队列记录当前信息,根据需求进行操作

class Solution {
  private:
    int capacity; // 容量
    unordered_map<int, int> mp;// 记录映射 cowId-priority
    queue<int> qu;// 记录当前的牛使用信息
    // 初始化缓存
    void CowCache(int capacity) {
        this->capacity = capacity;
    }
    // 返回优先级
    int getPriority(int cowId) {
        if (mp.count(cowId)) {
            // 队列已满,需要弹出最久未使用
            if (qu.size() >= capacity) {
                qu.pop();
            }
            // 新的被使用的 cowId 入队
            qu.push(cowId);
            return mp[cowId];
        } else {
            return -1;
        }
    }
    // 插入或更新优先级
    void setPriority(int cowId, int priority) {
        // 队列已满,分别在 队列 和 mp 中删去队头元素
        if (qu.size() >= capacity) {
            int del = qu.front();
            qu.pop();
            mp.erase(del);
        }
        // 更新记录
        qu.push(cowId);
        mp[cowId] = priority;
    }
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param operations string字符串vector
     * @param args int整型vector<vector<>>
     * @return int整型vector
     */
    vector<int> cowCacheOperations(vector<string>& operations,
                                   vector<vector<int> >& args) {
        vector<int> ans;
        for (int i = 0; i < operations.size(); i++) {
            if (operations[i] == "CowCache") {
                CowCache(args[i][0]);
                ans.push_back(-2);
            } else if (operations[i] == "getPriority") {
                ans.push_back(getPriority(args[i][0]));
            } else if (operations[i] == "setPriority") {
                setPriority(args[i][0], args[i][1]);
                ans.push_back(-2);
            }
        }
        return ans;
    }
};

时间复杂度:

1、初始化缓存,O(1)

2、查询优先级,查找牛ID是否存在于 unordered_map 中:O(1) 平均时间复杂度

如果队列已满,弹出队首元素:O(1)

将牛ID插入队列:O(1)

总时间复杂度为 O(1)

3、更新优先级,如果队列已满,删除队首元素并在 unordered_map 中删除相应记录:O(1)

将牛ID插入队列并更新映射:O(1)

总时间复杂度为 O(1)

4、执行所有操作,遍历 operations 列表,对每个操作调用相应方法。假设有 n 个操作,则时间复杂度为 O(n)

综上,每个操作的时间复杂度为 O(1),所有操作的总时间复杂度为 O(n)

空间复杂度:

1、mp:存储最多 capacity 个牛ID和优先级,每个牛ID和优先级占用 O(1) 空间,最多 O(capacity)

2、qu:存储最多 capacity 个牛ID,每个牛ID占用 O(1) 空间,最多 O(capacity)

3、operations 和 args:假设有 n 个操作,每个操作参数的大小固定或可忽略不计,则操作列表和参数列表的空间复杂度为 O(n)

4、ans:存储 n 个操作的结果,空间复杂度为 O(n)

综上,总空间复杂度为 O(capacity + n)