【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;
};
相关推荐
long3164 分钟前
弗洛伊德·沃肖算法 Floyd Warshall Algorithm
java·后端·算法·spring·springboot·图论
有一个好名字5 分钟前
力扣-咒语和药水的成功对数
java·算法·leetcode
Loo国昌10 分钟前
【LangChain1.0】第一篇:基础认知
后端·python·算法·语言模型·prompt
H Corey19 分钟前
Java--面向对象之继承与多态
java·开发语言·windows·学习·算法·intellij-idea
永远都不秃头的程序员(互关)42 分钟前
【K-Means深度探索(三)】告别“初始陷阱”:K-Means++优化质心初始化全解析!
算法·机器学习·kmeans
程序员-King.1 小时前
day136—快慢指针—重排链表(LeetCode-143)
算法·leetcode·链表·快慢指针
万行1 小时前
差速两轮机器人位移与航向角增量计算
人工智能·python·算法·机器人
qq_336313931 小时前
java基础-多线程练习
java·开发语言·算法
不知名XL1 小时前
day25 贪心算法 part03
算法·贪心算法
期待のcode1 小时前
Java虚拟机的垃圾回收器
java·开发语言·jvm·算法