@@ -68,33 +68,100 @@ public class CourseSchedule {
68
68
// return true;
69
69
// }
70
70
71
+ // V0'
72
+ // IDEA : BFS
73
+ public boolean canFinish (int numCourses , int [][] prerequisites ) {
74
+ Map <Integer , ArrayList <Integer >> map = new HashMap <Integer , ArrayList <Integer >>();
75
+ int [] indegree = new int [numCourses ];
76
+ Queue <Integer > queue = new LinkedList <Integer >();
77
+ int count = numCourses ;
78
+
79
+ /** NOTE !!! numCourses */
80
+ for (int i = 0 ; i < numCourses ; i ++) {
81
+ map .put (i , new ArrayList <Integer >());
82
+ }
83
+
84
+ /** NOTE !!! prerequisites */
85
+ for (int i = 0 ; i < prerequisites .length ; i ++) {
86
+ map .get (prerequisites [i ][0 ]).add (prerequisites [i ][1 ]);
87
+
88
+ /** NOTE : below approaches has same effect */
89
+ // V1
90
+ //indegree[prerequisites[i][1]]++;
91
+ // V2
92
+ indegree [prerequisites [i ][1 ]] += 1 ;
93
+ }
94
+
95
+ /** NOTE !!! numCourses */
96
+ for (int i = 0 ; i < numCourses ; i ++) {
97
+ // only insert to queue if "indegree == 0" (course has NO prerequisite)
98
+ if (indegree [i ] == 0 ) {
99
+ queue .offer (i ); // insert to queue
100
+ }
101
+ }
102
+
103
+ while (!queue .isEmpty ()) {
104
+ int current = queue .poll (); // pop from queue
105
+ for (int i : map .get (current )) {
106
+
107
+ /** NOTE : below approaches has same effect */
108
+ // V1
109
+ // if (--indegree[i] == 0) {
110
+ // queue.offer(i);
111
+ // }
112
+
113
+ // V2
114
+ if (indegree [i ] == 1 ) {
115
+ queue .offer (i );
116
+ } else {
117
+ indegree [i ] -= 1 ;
118
+ }
119
+
120
+ }
121
+ // when finish a course checking ( course visit and course prerequisite visit)
122
+ count --;
123
+ }
124
+ return count == 0 ;
125
+ }
126
+
71
127
// V1
72
128
// IDEA : BFS
73
129
// https://leetcode.com/problems/course-schedule/solutions/58775/my-java-bfs-solution/
74
- public boolean canFinish (int numCourses , int [][] prerequisites ) {
130
+ public boolean canFinish__ (int numCourses , int [][] prerequisites ) {
75
131
Map <Integer , ArrayList <Integer >> map = new HashMap <Integer , ArrayList <Integer >>();
76
132
int [] indegree = new int [numCourses ];
77
133
Queue <Integer > queue = new LinkedList <Integer >();
78
134
int count = numCourses ;
135
+
136
+ /** NOTE !!! numCourses */
79
137
for (int i = 0 ; i < numCourses ; i ++) {
80
138
map .put (i , new ArrayList <Integer >());
81
139
}
140
+
141
+ /** NOTE !!! prerequisites */
82
142
for (int i = 0 ; i < prerequisites .length ; i ++) {
83
143
map .get (prerequisites [i ][0 ]).add (prerequisites [i ][1 ]);
144
+
145
+ /** NOTE : below approaches has same effect */
84
146
// V1
85
147
//indegree[prerequisites[i][1]]++;
86
148
// V2
87
149
indegree [prerequisites [i ][1 ]] += 1 ;
88
150
}
151
+
152
+ /** NOTE !!! numCourses */
89
153
for (int i = 0 ; i < numCourses ; i ++) {
154
+ // only insert to queue if "indegree == 0" (course has NO prerequisite)
90
155
if (indegree [i ] == 0 ) {
91
- queue .offer (i );
156
+ queue .offer (i ); // insert to queue
92
157
}
93
158
}
159
+
94
160
while (!queue .isEmpty ()) {
95
- int current = queue .poll ();
161
+ int current = queue .poll (); // pop from queue
96
162
for (int i : map .get (current )) {
97
163
164
+ /** NOTE : below approaches has same effect */
98
165
// V1
99
166
// if (--indegree[i] == 0) {
100
167
// queue.offer(i);
@@ -108,6 +175,7 @@ public boolean canFinish(int numCourses, int[][] prerequisites) {
108
175
}
109
176
110
177
}
178
+ // when finish a course checking ( course visit and course prerequisite visit)
111
179
count --;
112
180
}
113
181
return count == 0 ;
0 commit comments