这段代码中可能会导致超时的原因是,在每一次循环中,都将已经访问过的字符串保存在visited
数组中,并且使用std::find()
函数进行查找。随着循环的进行,visited
数组会变得越来越大,而每次查找操作的时间复杂度是O(n),其中n是visited
数组的大小。
为了优化这个问题,可以考虑使用哈希表(unordered_set)来存储已经访问过的字符串。哈希表的插入、删除和查找操作的平均时间复杂度是O(1)。修改代码如下:
class Solution {
public:
std::unordered_set<std::string> visited;
std::vector<std::string> optionalList(const std::string &s, const std::vector<std::string> &deadends) {
std::vector<std::string> result;
for (int i = 0; i < 4; i++) {
char c = s[i];
// -1
s[i] = (c == '0' ? '9' : c - 1);
if (visited.find(s) == visited.end() && std::find(deadends.begin(), deadends.end(), s) == deadends.end()) {
result.push_back(s);
visited.insert(s);
}
// +1
s[i] = (c == '9' ? '0' : c + 1);
if (visited.find(s) == visited.end() && std::find(deadends.begin(), deadends.end(), s) == deadends.end()) {
result.push_back(s);
visited.insert(s);
}
// revert s[i] back to the original value
s[i] = c;
}
return result;
}
int openLock(std::vector<std::string>& deadends, const std::string& target) {
std::string init = "0000";
if (std::find(deadends.begin(), deadends.end(), init) != deadends.end()) {
return -1; // the initial state is a deadend
}
visited.insert(init);
std::queue<std::string> q;
q.push(init);
int depth = 0;
while (!q.empty()) {
int k = q.size();
while(k--) {
const std::string p = q.front();
q.pop();
if (p == target) {
return depth;
}
std::vector<std::string> optionalList = optionalList(p, deadends);
for (const auto& item : optionalList) {
visited.insert(item);
q.push(item);
}
}
depth++;
}
return -1;
}
};
这样修改之后,对已经访问过的字符串的查找操作的时间复杂度将降为O(1),可以避免超时问题。
内容由零声教学AI助手提供,问题来源于学员提问