leetcode207.课程表
leetcode207.课程表
题目
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。
例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。
用例
输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
输出:false
解释:总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
求解
/**
* @param {number} numCourses
* @param {number[][]} prerequisites
* @return {boolean}
*/
var canFinish = function(numCourses, prerequisites) {
let visited = new Array(numCourses).fill(0)
let C_in = new Array(numCourses).fill(0)
//初始化出度入度
for(let i=0;i<prerequisites.length;i++){
C_in[prerequisites[i][0]]=C_in[prerequisites[i][0]]+1
}
let flag=true
while(flag){
flag =false
//是否有入度为0,且未被访问过的
for(let i=0;i<numCourses;i++){
if(C_in[i]==0&&visited[i]==0){
visited[i]=1
//将i作为前置课程的入度-1
for(let j=0;j<prerequisites.length;j++){
if(prerequisites[j][1]==i){
C_in[prerequisites[j][0]]=C_in[prerequisites[j][0]]-1
}
}
flag=true
}
}
}
for(let j=0;j<numCourses;j++){
if(visited[j]==0){
return false
}
}
return true
};

浙公网安备 33010602011771号