课程表
2023/01/01
示例
示例一
输入: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) {
const edges = new Array(numCourses)
const visited = new Array(numCourses).fill(0)
let valid = true
for (let i = 0; i < numCourses; i++) {
edges[i] = []
}
for (const info of prerequisites) {
edges[info[1]].push(info[0])
}
const dfs = u => {
visited[u] = 1
for (const v of edges[u]) {
if (visited[v] === 0) {
dfs(v)
if (!valid) {
return
}
} else if (visited[v] === 1) {
valid = false
return
}
}
visited[u] = 2
}
for (let i = 0; i < numCourses && valid; i++) {
if (visited[i] === 0) {
dfs(i)
}
}
return valid
};