@@ -49,7 +49,8 @@ private List[] buildAdjList(int numCourses, int[][] prerequisites) {
4949 return preLists ;
5050 }
5151
52- private void DFS (int course , List [] preLists , Set <Integer > visited , boolean [] done , List <Integer > completedCourses ) {
52+ private void DFS (int course , List [] preLists , Set <Integer > visited , boolean [] done ,
53+ List <Integer > completedCourses ) {
5354 visited .add (course );
5455 done [course ] = true ;
5556 List <Integer > preCourses = preLists [course ];
@@ -65,13 +66,58 @@ private void DFS(int course, List[] preLists, Set<Integer> visited, boolean[] do
6566 }
6667
6768 visited .remove (course );
68-
6969 completedCourses .add (course );
7070 }
7171
72+ public int [] findOrder2 (int numCourses , int [][] prerequisites ) {
73+ // course -> preq course
74+ Map <Integer , List <Integer >> edges = new HashMap <>();
75+ for (int [] p : prerequisites ) {
76+ edges .computeIfAbsent (p [0 ], (k ) -> new ArrayList <>()).add (p [1 ]);
77+ }
78+
79+ try {
80+ boolean [] done = new boolean [numCourses ];
81+ boolean [] currentPath = new boolean [numCourses ];
82+ List <Integer > completed = new ArrayList <>();
83+ for (int course = 0 ; course < numCourses ; course ++) {
84+ if (!done [course ]) {
85+ tpl (edges , course , done , completed , currentPath );
86+ }
87+ }
88+
89+ // System.out.println("completed=" + completed);
90+ return completed .stream ()
91+ .mapToInt (Integer ::intValue )
92+ .toArray ();
93+ } catch (IllegalArgumentException e ) {
94+ return new int [0 ];
95+ }
96+ }
97+
98+ private void tpl (Map <Integer , List <Integer >> edges , int course , boolean [] done , List <Integer > completed , boolean [] currentPath ) {
99+ currentPath [course ] = true ;
100+ done [course ] = true ;
101+ List <Integer > preqs = edges .get (course );
102+ if (preqs != null ) {
103+ for (int preq : preqs ) {
104+ if (currentPath [preq ]) {
105+ throw new IllegalArgumentException ();
106+ } else if (!done [preq ]) {
107+ tpl (edges , preq , done , completed , currentPath );
108+ }
109+ }
110+ }
111+ completed .add (course );
112+ currentPath [course ] = false ;
113+ }
114+
72115 public static void main (String [] args ) {
73- int [] order = new CourseScheduleII ().findOrder (5 , new int [][]{{0 , 1 }, {1 , 2 }, {1 , 3 }, {3 , 4 }, {4 , 3 }});
74- // int[] order = new CourseScheduleII().findOrder(3, new int[][] {{0, 1}, {0, 2}, {1, 2}});
116+ // int[] order = new CourseScheduleII().findOrder(5, new int[][]{{0, 1}, {1, 2},
117+ // {1, 3}, {3, 4}, {4, 3}});
118+ // int[] order = new CourseScheduleII().findOrder(3, new int[][] {{0, 1}, {0,
119+ // 2}, {1, 2}});
120+ int [] order = new CourseScheduleII ().findOrder (3 , new int [][] { { 0 , 1 }, { 1 , 0 } });
75121 System .out .println (Arrays .toString (order ));
76122 }
77123
0 commit comments