用一个哈希表和一个队列记录当前信息,根据需求进行操作
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)

京公网安备 11010502036488号