@@ -2733,52 +2733,124 @@ public boolean canFinish(int numCourses, int[][] prerequisites) {
27332733 return false ;
27342734 }
27352735
2736- private int [] topoSort (int numCourses , int [][] prerequisites ){
2737- int [] tSorting = new int []{numCourses };
2736+ /**
2737+ * int[][] prerequisites: [1, 2], so 1 is 2's prerequisite
2738+ *
2739+ */
2740+ private List <Integer > topoSort (int numCourses , int [][] prerequisites ){
2741+
2742+ //int[] tSorting = new int[]{numCourses};
27382743
27392744 // init : 1) preList 2) degree
27402745 Map <Integer , List <Integer >> preList = new HashMap <>();
2741- //Map <Integer, Integer> degree = new HashMap <>();
2742- List <Integer > degree = new ArrayList <>();
2746+ List <Integer > degrees = new ArrayList <>();
2747+ List <Integer > res = new ArrayList <>();
27432748
2749+ // init all degree as 0
2750+ for (int i = 0 ; i < numCourses ; i ++){
2751+ degrees .add (i );
2752+ }
2753+
2754+ // init preList and update degrees
27442755 for (int [] x : prerequisites ){
2745- int pre = x [1 ];
2746- int cur = x [0 ]; // ???
2756+ int pre = x [0 ];
2757+ int cur = x [1 ]; // ???
2758+
2759+ // update degrees
2760+ degrees .set (cur , degrees .get (cur )+1 ); // ???
2761+ // update PreList
27472762 if (!preList .containsKey (pre )){
27482763 preList .put (pre , new ArrayList <>());
27492764 }else {
27502765 List <Integer > curItems = preList .get (pre );
27512766 curItems .add (cur );
27522767 preList .put (pre , curItems );
2768+ //preList.put(pre, preList.get(pre).add(cur));
27532769 }
27542770 }
27552771
2756- for (int [] x : prerequisites ){
2757- int pre = x [1 ];
2758- int cur = x [0 ]; // ???
2759- degree .set (cur , degree .get (cur )+1 );
2760- }
27612772
27622773 Queue <Integer > queue = new LinkedList ();
2763- queue .add (0 );
2764- int idx = 0 ;
2765- tSorting [idx ] = 0 ;
2774+ // add all node with degree=0 to queue
2775+ for (int j = 0 ; j < degrees .size (); j ++){
2776+ if (degrees .get (j ).equals (0 )){
2777+ queue .add (j );
2778+ }
2779+ }
2780+
2781+ // int idx = 0;
2782+ // tSorting[idx] = 0;
27662783
27672784 while (!queue .isEmpty ()){
27682785 Integer curNode = queue .poll ();
2786+ // NOTE !!! add node poll from queue to final result
2787+ res .add (curNode );
2788+
27692789 for (Integer subNode : preList .get (curNode )){
2770- if (degree .get (subNode ).equals (0 )){
2771- idx += 1 ;
2772- tSorting [idx ] = subNode ;
2773- degree .set (subNode , degree .get (subNode )-1 );
2790+ // if (degrees.get(subNode).equals(0)){
2791+ // idx += 1;
2792+ // tSorting[idx] = subNode;
2793+ // degrees.set(subNode, degrees.get(subNode)-1);
2794+ // }
2795+
2796+ //preList[subNode] -= 1;
2797+ degrees .set (subNode , degrees .get (subNode )-1 );
2798+ if (degrees .get (subNode ).equals (0 )){
2799+ queue .add (subNode );
27742800 }
27752801 }
27762802 }
27772803
2778- return tSorting ;
2804+ return res ;
27792805 }
27802806
27812807
2808+ // private int[] topoSort(int numCourses, int[][] prerequisites){
2809+ // int[] tSorting = new int[]{numCourses};
2810+ //
2811+ // // init : 1) preList 2) degree
2812+ // Map<Integer, List<Integer>> preList = new HashMap<>();
2813+ // //Map<Integer, Integer> degree = new HashMap<>();
2814+ // List<Integer> degree = new ArrayList<>();
2815+ //
2816+ // for (int[] x : prerequisites){
2817+ // int pre = x[1];
2818+ // int cur = x[0]; // ???
2819+ // if (!preList.containsKey(pre)){
2820+ // preList.put(pre, new ArrayList<>());
2821+ // }else{
2822+ // List<Integer> curItems = preList.get(pre);
2823+ // curItems.add(cur);
2824+ // preList.put(pre, curItems);
2825+ // }
2826+ // }
2827+ //
2828+ // for (int[] x : prerequisites){
2829+ // int pre = x[1];
2830+ // int cur = x[0]; // ???
2831+ // degree.set(cur, degree.get(cur)+1);
2832+ // }
2833+ //
2834+ // Queue<Integer> queue = new LinkedList();
2835+ // queue.add(0);
2836+ // int idx = 0;
2837+ // tSorting[idx] = 0;
2838+ //
2839+ // while(!queue.isEmpty()){
2840+ // Integer curNode = queue.poll();
2841+ // for (Integer subNode : preList.get(curNode)){
2842+ // if (degree.get(subNode).equals(0)){
2843+ // idx += 1;
2844+ // tSorting[idx] = subNode;
2845+ // degree.set(subNode, degree.get(subNode)-1);
2846+ // }
2847+ // }
2848+ // }
2849+ //
2850+ // return tSorting;
2851+ // }
2852+
2853+
27822854}
27832855
27842856
0 commit comments