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

题目地址: 链接

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

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

  1. 如果遇到 「未访问」 节点(vitedi == 0),进入递归;
  2. 如果遇到 「正在访问」 节点(vitedi == 1),有环!返回 false;
  3. 如果遇到「已访问完毕」节点(vitedi == 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;
};
相关推荐
leobertlan5 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的5 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1236 小时前
答案daanC语言
数据结构·算法
小 黄 鸡6 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
Navigator_Z8 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
pride.li9 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
旺仔仔仔10 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔10 小时前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生10 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川10 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法