1、題目
課程表 - 力扣(LeetCode) https://leetcode-cn.com/problems/course-schedule/
2、題解
這道題的思路其實很簡單,排除了不滿足的情況自然就滿足了
首先,如果學(xué)習(xí)次數(shù)少于課程數(shù)量,就一定不能滿足。
其次,如果將各個課程看成一個個的節(jié)點,節(jié)點的先決關(guān)系就是兩點之間的連線,而且是有方向的連線。這樣就課程和課程之間的關(guān)系就形成了一個有向圖。但凡有向圖中有兩點間存在方向相反的兩條線,即A->B 且B->A成立,那么基于類似死鎖這樣的情況,我們就無法學(xué)完當前的課程。
那么我們只需要判斷當前數(shù)據(jù)代表的有向圖是否存在環(huán)即可;
3、代碼
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[] inDegree = new int[numCourses];
int[][] graph = new int[numCourses][numCourses];
for(int i = 0; i < prerequisites.length; i++){
graph[prerequisites[i][1]][prerequisites[i][0]] = 1;
inDegree[prerequisites[i][0]]++;
}
//定義一個隊列Q,并把所有入度為0的節(jié)點加入隊列。
Queue<Integer> queue = new LinkedList<>();
for(int i = 0; i < numCourses; i++){
if(inDegree[i] == 0){
queue.add(i);
}
}
//取隊首節(jié)點,輸出。然后刪去所有從它出發(fā)的邊,并令這些邊到達的頂點的入度減1,如果某個頂點的入度減為0,則將其加入隊列。
int num = 0;
while(!queue.isEmpty()){
int u = queue.poll();
for(int v = 0; v < numCourses; v++){
if(graph[u][v] != 0){
inDegree[v]--;
if(inDegree[v] == 0){
queue.add(v);
}
}
}
num++;
}
return num == numCourses;
}
}
4、執(zhí)行結(jié)果

image.png