【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;
};
相关推荐
祁思妙想3 小时前
【LeetCode100】--- 101.重排链表【思维导图+复习回顾】
算法·leetcode·链表
Dream it possible!3 小时前
LeetCode 面试经典 150_链表_随机链表的复制(59_138_C++_中等)
c++·leetcode·链表
文火冰糖的硅基工坊3 小时前
[人工智能-大模型-69]:模型层技术 - 计算机处理问题的几大分支:数值型性问题、非数值型问题?
算法·决策树·机器学习
OG one.Z4 小时前
05_逻辑回归
算法·机器学习·逻辑回归
lzptouch4 小时前
逻辑斯蒂回归(Logistic Regression)算法
算法·数据挖掘·回归
on_pluto_4 小时前
【基础复习1】ROC 与 AUC:逻辑回归二分类例子
人工智能·机器学习·职场和发展·学习方法·1024程序员节
SunnyKriSmile8 小时前
C语言译码操作
c语言·算法·if语句·译码操作·switch语句
小小小CTFER8 小时前
理论题] 2025 年 “技耀泉城” 海右技能人才大赛网络安全知识竞赛题目(二)
算法·安全·web安全