力扣HOT100之图论:207. 课程表

这道题第一次做,有向图判断是否有环的思路是完全忘完了,这次没有看灵神的题解,感觉笨猪爆破组的题解更加通俗易懂一些,强烈建议参考他的题解,因为图论本来就很难,光是理解起来就已经很费劲了,没有必要为了代码的简洁和优雅而忽略了代码的可读性。这道题还是用BFS来做,我们需要明确几个点:

  1. 当一门课程需要前置课程时,这门课程是有入度的,当该门课程的前置课程修完一门,则入度-1,当入度减为0时,说明该门课程的前置课程全部修完,可以直接修读。
  2. 只有当一门课程的入度为0时,才能加入队列中,从队列中取出来的课程,都是在现有的基础上可以直接修读的课程,每当取出一门课程,我们就需要将该课程的所有目标课程的入度减一(前置课程为是目标课程服务的),当有目标课程的入度被减为0时,我们需要立马将其加入到队列中
  3. 当队列为空时,说明能修读的课程都已经修读完了,只有当图中存在环时,不能修读完所有课程,因为存在循环依赖,因此我们需要定义一个变量finish来记录已经修读完毕的课程,应当在课程被从队列中弹出时(被弹出就意味着该课程被修读)标记,当循环结束时,判断修读的课程数和输入的课程总数是否相等,若不相等则一定有环。
    明白了以上几个关键要点后,代码就很容易写了。
cpp 复制代码
class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int> inDegree(numCourses, 0);    //记录每门课程的入度
        vector<vector<int>> grah(numCourses);  //使用vector存储邻接表
        //计算每门课程的入度,并构建邻接表
        for(vector<int>& prerequisite : prerequisites){
            int course = prerequisite[0];   //目标课程
            int preCourse = prerequisite[1];    //前置课程
            inDegree[course]++;    //目标课程的入度+1
            grah[preCourse].emplace_back(course);  
        }
        queue<int> My_Queue;
        //存储入度为0的课程
        for(int i = 0; i < inDegree.size(); i++){
            if(inDegree[i] == 0)
                My_Queue.push(i);
        }
        int finish = 0;  //记录已修完的课程
        while(!My_Queue.empty()){
            int pre = My_Queue.front();
            My_Queue.pop();
            finish++;
            // pre课程的所有目标课程入度-1
            for(auto course : grah[pre]){
                inDegree[course]--;
                if(inDegree[course] == 0)  //某门后续课程可以直接修读了
                    My_Queue.push(course);
            }  
        }
        return finish == numCourses;
    }
};
相关推荐
嵌入式小能手9 分钟前
飞凌嵌入式ElfBoard-进程间的通信之信号处理sigaction
linux·算法·信号处理
re林檎11 分钟前
算法札记——5.14
算法
研究点啥好呢19 分钟前
DJI 机器人视觉算法工程师 面试题精选:10道高频考题+答案解析(背诵版)
算法·面试·机器人·dji
热心网友俣先生32 分钟前
2026年认证杯二阶段A题赛题解析
人工智能·算法·机器学习
Black蜡笔小新1 小时前
自动化AI算法训练服务器DLTM深度学习推理工作站AI赋能质检助力制造业智能化转型
人工智能·算法·自动化
小雅痞1 小时前
[Java][Leetcode simple] 205. 同构字符串
java·算法·leetcode
智者知已应修善业1 小时前
【51单片机独立按键控制数码管自增自减】2023-10-5
c++·经验分享·笔记·算法·51单片机
2301_800895101 小时前
第十四届蓝桥杯国赛b组真题---备战国赛版h
算法·蓝桥杯·深度优先
生信之灵1 小时前
告别模板配准:LAMNr Flow如何用一次求逆破解多模态解剖对齐难题
人工智能·算法
焜昱错眩..1 小时前
力扣周赛难题 3906.统计网格路径中好整数的数目——自我拆解学习与分析(数位dp上下界的奇妙)
学习·算法·leetcode·动态规划