题目链接:1604. 警告一小时内使用相同员工卡大于等于三次的人
方法:模拟
解题思路
先对数据进行处理,根据 \(name\) 将其时间存储在哈希表中,对哈兮表进行遍历,每个 \(name\) 对应一个时间序列,首先对时间序列进行从小到大排序,从 \(i = 2\) 开始遍历该序列,若存在 \(list[i - 2] + 60 >= list[i]\),则发送警告,即将该 \(name\) 存储起来。最后对答案数组进行字母序排序。
代码
class Solution {
public:
vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
int n = keyName.size();
unordered_map<string, vector<int>> timeMap;
for(int i = 0; i < n; i ++ ) {
string name = keyName[i];
string time = keyTime[i];
int hour = (time[0] - '0') * 10 + (time[1] - '0');
int minute = (time[3] - '0') * 10 + (time[4] - '0');
timeMap[name].emplace_back(hour * 60 + minute);
}
vector<string> ans;
for (auto &[name, list] : timeMap) {
sort(list.begin(), list.end());
for (int i = 2; i < list.size(); i ++ ) {
if (list[i - 2] + 60 >= list[i]) {
ans.emplace_back(name);
break;
}
}
}
sort(ans.begin(), ans.end());
return ans;
}
};
复杂度分析
时间复杂度:\(O(n*logn)\);
空间复杂度:\(O(n)\)。