我正在尝试解决https://leetcode.com/problems/find-eventual-safe-states/
我的方法是,简单地使给定图中的所有节点都参与循环。
这是我的代码:
class Solution {
Set<Integer> result;
//Set<Integer> overallVisited;
int ct = 0;
int[] overallVisited;
public List<Integer> eventualSafeNodes(int[][] graph) {
Set<Integer> visitedSet = new HashSet<Integer>();
Set<Integer> allNodes = new HashSet<Integer>();
overallVisited = new int[graph.length];
result = new HashSet<Integer>();
for(int i = 0; i < graph.length; i++) {
allNodes.add(i);
if(!result.contains(i) && overallVisited[i] == 0)dfs(i, new HashSet<Integer>(), graph);
}
allNodes.removeAll(result);
return new ArrayList<Integer>(allNodes);
}
public boolean dfs(int root, Set<Integer> visitedSet, int[][] graph) {
ct++;
boolean isInCyle = false;
int[] neighbors = graph[root];
visitedSet.add(root);
overallVisited[root] = 1;
for(int neighbor : neighbors) {
if(!visitedSet.contains(neighbor) && !result.contains(neighbor)) {
isInCyle = dfs(neighbor, visitedSet, graph);
if(isInCyle) {
result.add(root);
visitedSet.remove(root);
return true;
}
}
else {
// cycle
result.add(root);
visitedSet.remove(root);
// don't process anymore since beyond this visitedSet
// we won't add anything else
return true;
}
}
visitedSet.remove(root);
return false;
}
}
据我所知,这种方法是一种简单的“深度峡湾搜索”,同时试图查看某个特定节点是否参与循环。
根据我的计算,这是一个O(N + E)解决方案,其中N是图中节点的数量,E是边的数量。
我在这里错了吗?我问这个问题是因为我遇到了在线法官提出的“超过时限”错误。
非常感谢!