Я пытаюсь решить 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 - количество ребер.
Я здесь не прав? Я спрашиваю об этом, так как я сталкиваюсь с ошибкой превышения лимита времени от интернет-судьи.
Большое спасибо!