• 2023-09-10 LeetCode每日一题(课程表 II)


    2023-09-10每日一题

    一、题目编号

    210. 课程表 II
    
    • 1

    二、题目链接

    点击跳转到题目位置

    三、题目描述

    现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。

    例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
    返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组

    示例 1:
    在这里插入图片描述
    示例 2:
    在这里插入图片描述
    示例 3:
    在这里插入图片描述
    提示:

    • 1 <= numCourses <= 2000
    • 0 <= prerequisites.length <= numCourses * (numCourses - 1)
    • prerequisites[i].length == 2
    • 0 <= ai, bi < numCourses
    • ai != bi
    • 所有[ai, bi] 互不相同

    四、解题代码

    class Solution {
    public:
        #define maxn 100010
        vector<int> Edges[maxn];
        int hash[maxn];
        int deg[maxn];
        void addEdge(int u,int v){
            Edges[u].push_back(v);
            deg[v]++;
        }
    
        vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
            memset(hash,0,sizeof(hash));
            memset(deg,0,sizeof(deg));
            int length=prerequisites.size();
            for(int i=0;i<length;i++){
                Edges[i].clear();
                hash[i]=0;
            }
            for(int i=0;i<length;i++){
                addEdge(prerequisites[i][1],prerequisites[i][0]);
            }
            queue<int> q;
            vector<int> res;
            int x=0;
            for(int i=0;i<numCourses;i++){
                if(deg[i]==0){
                    x++;
                    q.push(i);
                    hash[i]=1;
                    res.push_back(i);
                }
            }
            vector<int> path;
            while(!q.empty()){
                int u=q.front();
                q.pop();
                for(int i=0;i<Edges[u].size();i++){
                    deg[Edges[u][i]]--;
                    if(deg[Edges[u][i]]==0 && hash[Edges[u][i]]==0){
                        q.push(Edges[u][i]);
                        hash[Edges[u][i]]=1;
                        res.push_back(Edges[u][i]);
                        x++;
                    }
                }
            }
            if(x==numCourses){
                return res;
            }
        return path;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    五、解题思路

    (1) 依然是一道拓扑排序的经典题目。

  • 相关阅读:
    Mysql逗号拼接字符串的关联查询及统计
    Windows OpenGL 图像色调
    Go-Excelize API源码阅读(十九)——SetHeaderFooter
    spi个人笔记
    Estimation with Bootstrap
    PostgreSQL 分组聚合查询中 filter 子句替换 case when
    【算法与数据结构】回溯算法、贪心算法、动态规划、图论(笔记三)
    Flink SQL 常用作业sql
    【实战】使用 Web Animations API 实现一个精确计时的时钟
    NMap 使用技巧总结(二)
  • 原文地址:https://blog.csdn.net/qq_56086076/article/details/132794942