Skip to content

Commit bbc057d

Browse files
add DFS solution for 207
1 parent f973ff2 commit bbc057d

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

src/main/java/com/fishercoder/solutions/_207.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.fishercoder.solutions;
22

3+
import java.util.ArrayList;
4+
import java.util.HashMap;
35
import java.util.HashSet;
46
import java.util.Iterator;
57
import java.util.LinkedList;
8+
import java.util.List;
9+
import java.util.Map;
610
import java.util.Queue;
711
import java.util.Set;
812

@@ -85,4 +89,46 @@ public boolean canFinish(int numCourses, int[][] prerequisites) {
8589
return true;
8690
}
8791
}
92+
93+
public static class Solution3 {
94+
/**
95+
* DFS, the fastest method in all, with the help of a cache and also converted edges into adjacency list,
96+
* although theoretically, all these three methods' time complexity is: O(V+E)
97+
*/
98+
public boolean canFinish(int numCourses, int[][] prerequisites) {
99+
List<List<Integer>> courseList = new ArrayList<>();
100+
for (int i = 0; i < numCourses; i++) {
101+
courseList.add(new ArrayList<>());
102+
}
103+
for (int[] pre : prerequisites) {
104+
courseList.get(pre[1]).add(pre[0]);
105+
}
106+
int[] visited = new int[numCourses];
107+
//visit each course using DFS
108+
for (int i = 0; i < numCourses; i++) {
109+
if (!dfs(i, courseList, visited)) {
110+
return false;
111+
}
112+
}
113+
return true;
114+
}
115+
116+
private boolean dfs(int course, List<List<Integer>> courseList, int[] visited) {
117+
visited[course] = 1;//mark as temporarily visited
118+
List<Integer> coursesCanBeTaken = courseList.get(course);
119+
for (int i = 0; i < coursesCanBeTaken.size(); i++) {
120+
int courseToTake = coursesCanBeTaken.get(i);
121+
if (visited[courseToTake] == 1) {
122+
return false;
123+
}
124+
if (visited[courseToTake] == 0) {
125+
if (!dfs(courseToTake, courseList, visited)) {
126+
return false;
127+
}
128+
}
129+
}
130+
visited[course] = 2;//mark it as completely done.
131+
return true;
132+
}
133+
}
88134
}

src/test/java/com/fishercoder/_207Test.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
public class _207Test {
1010
private static _207.Solution1 solution1;
1111
private static _207.Solution2 solution2;
12+
private static _207.Solution3 solution3;
1213
private static int[][] prerequisites;
1314
private static int numCourses;
1415

1516
@BeforeClass
1617
public static void setup() {
1718
solution1 = new _207.Solution1();
1819
solution2 = new _207.Solution2();
20+
solution3 = new _207.Solution3();
1921
}
2022

2123
@Test
@@ -24,6 +26,7 @@ public void test1() {
2426
prerequisites = new int[][]{{0, 1}};
2527
assertEquals(true, solution1.canFinish(numCourses, prerequisites));
2628
assertEquals(true, solution2.canFinish(numCourses, prerequisites));
29+
assertEquals(true, solution3.canFinish(numCourses, prerequisites));
2730
}
2831

2932
@Test
@@ -43,6 +46,7 @@ public void test2() {
4346
};
4447
assertEquals(true, solution1.canFinish(numCourses, prerequisites));
4548
assertEquals(true, solution2.canFinish(numCourses, prerequisites));
49+
assertEquals(true, solution3.canFinish(numCourses, prerequisites));
4650
}
4751

4852
@Test
@@ -62,5 +66,6 @@ public void test3() {
6266
};
6367
assertEquals(true, solution1.canFinish(numCourses, prerequisites));
6468
assertEquals(true, solution2.canFinish(numCourses, prerequisites));
69+
assertEquals(true, solution3.canFinish(numCourses, prerequisites));
6570
}
6671
}

0 commit comments

Comments
 (0)