在这段代码中,你的DFS函数使用了递归来进行深度优先搜索,但是由于没有使用剪枝操作,可能导致重复搜索和无限递归,从而导致超时。可以考虑以下几点进行优化:
使用标记数组代替vector
visited:可以使用一个大小为n的bool数组来表示节点是否已经访问过,避免每次递归都重新构建visited数组。 使用unordered_set替代vector来存储邻接表:使用unordered_set会更高效地判断元素是否存在,并且可以避免插入重复元素。
添加剪枝操作:在递归前判断target节点是否已经被访问过或者已经找到路径,如果是则直接返回。
下面是优化后的代码示例:
class Solution {
public:
bool IsExit = false;
void DFS(int i, int target, vector<bool>& visited, unordered_map<int, unordered_set<int>>& map) {
if (IsExit || visited[i]) return;
if (i == target) {
IsExit = true;
return;
}
visited[i] = true;
if (map.count(i)) {
for (const auto item : map[i]) {
DFS(item, target, visited, map);
}
}
}
bool findWhetherExistsPath(int n, vector<vector<int>>& graph, int start, int target) {
unordered_map<int, unordered_set<int>> map;
for (const auto& edge : graph) {
int u = edge[0];
int v = edge[1];
map[u].insert(v);
}
vector<bool> visited(n, false);
DFS(start, target, visited, map);
return IsExit;
}
};
这样做的优化点主要在于减少了重复搜索和无限递归,使用unordered_set提高查找效率,以及使用bool数组代替vector来记录访问状态。希望对你有帮助!
内容由零声教学AI助手提供,问题来源于学员提问