【LeetCode热题100(52/100)】课程表

题目地址: 链接

思路: 核心思路:判断图是否有环。

递归:使用数组构建课程的邻接表,如果有环,遍历时一定会陷入死循环。期间利用 vited 判断当前访问节点的状态(是否重复访问,访问完毕,未访问)。

  1. 如果遇到 「未访问」 节点(vited[i] == 0),进入递归;
  2. 如果遇到 「正在访问」 节点(vited[i] == 1),有环!返回 false;
  3. 如果遇到「已访问完毕」节点(vited[i] == 2),可复用结果,返回 true;
js 复制代码
/**
 * @param {number} numCourses
 * @param {number[][]} prerequisites
 * @return {boolean}
 */

var canFinish = function(numCourses, prerequisites) {
    let adj = Array.from({length: numCourses}, () => new Array());
    for(const [course, precourse] of prerequisites)
        adj[course].push(precourse);
    
    const vited = new Array(numCourses).fill(0);
    const dfs = (i) => {
        // 利用缓存,复用
        if(vited[i] == 1) return false;
        if(vited[i] == 2) return true;

        vited[i] = 1; // 正在访问
        let curPreCourse = adj[i];

        let ans = true;
        for(let num of curPreCourse) {
            ans = dfs(num, vited);
            if(!ans) return ans;
        }
        vited[i] = 2; // 访问结束,可以复用
        return ans;
    }
    for(let i = 0; i < numCourses; i ++) {
        if(!dfs(i)) return false;
    } 

    return true;
};
相关推荐
测试秃头怪9 分钟前
Python+selenium搭建Web自动化测试框架
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
programhelp_21 分钟前
Amazon OA 2026 高频题型拆解 + 速通攻略
数据结构·算法
moonsea020326 分钟前
2026.4.14
数据结构·算法·图论
x_xbx27 分钟前
LeetCode:42. 接雨水
算法·leetcode·职场和发展
lixinnnn.1 小时前
01BFS:小明的游戏
算法
falldeep1 小时前
Claude Code源码分析
人工智能·算法·机器学习·强化学习
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2026.04.14 题目:2463.最小移动距离
笔记·算法·leetcode
feng_you_ying_li1 小时前
C++11可变模板参数,包扩展,emplace系列和push系列的区别
前端·c++·算法
tankeven1 小时前
HJ177 可匹配子段计数
c++·算法
剑挑星河月1 小时前
55.跳跃游戏
数据结构·算法·leetcode