当前位置: 首页 > article >正文

408算法题leetcode--第19天

207. 课程表

  • 207. 课程表
  • 思路:bfs和dfs都行,看注释
  • 时间和空间:O(n + m)
class Solution {
private:
    vector<vector<int>>graph;  // 邻接矩阵
    vector<int>in;  // 入度
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        // 拓扑排序, bfs
        // 如果节点入度 = 0,入队
        // 循环:移出节点的出边,如果相邻点入读为0,也入队
        // 2种情况:1. 入队了n个节点,则true;否则是有环图,false
        // 也可以用dfs,用flag数组标记,如果某个点遍历2次,则false,其他为true
        graph.resize(numCourses);
        in.resize(numCourses);
        for(auto& i : prerequisites){
            graph[i[1]].push_back(i[0]);  // 1 -> 0
            ++in[i[0]];
        }
        // 队列,找入队为0的点
        queue<int>q;
        for(int i = 0; i < numCourses; i++){
            if(in[i] == 0){
                q.push(i);
            }
        }
        // 循环
        int count = 0;
        while(!q.empty()){
            ++count;
            int temp = q.front();
            q.pop();
            // 删除出边
            for(int it : graph[temp]){
                --in[it];
                if(in[it] == 0){
                    q.push(it);
                }
            }
        }
        return count == numCourses;
    }
};

210. 课程表 II

  • 210. 课程表 II
  • 思路,空间和时间同上
class Solution {
private:
    vector<vector<int>>graph;
    vector<int>in;
    vector<int>ret;
    
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        // bfs
        // 找入度为0的节点
        graph.resize(numCourses);
        in.resize(numCourses);
        for(auto it : prerequisites){
            graph[it[1]].push_back(it[0]);
            ++in[it[0]];
        }
        queue<int>q;
        for(int i = 0; i < numCourses; i++){
            if(in[i] == 0){
                q.push(i);
            }
        }
        // 循环
        while(!q.empty()){
            int temp = q.front();
            q.pop();
            ret.push_back(temp);
            // 删除入边
            for(auto it : graph[temp]){
                --in[it];
                if(in[it] == 0){
                    q.push(it);
                }
            }
        }
        if(ret.size() != numCourses) return vector<int>{};
        return ret; 
    }
};

http://www.kler.cn/news/326135.html

相关文章:

  • java通过webhook给飞书发送群消息
  • PTA L1-080 乘法口诀数列
  • C语言线程编程深度解析
  • Elasticsearch UNASSIGNED 怎么修复
  • OJ在线评测系统 后端 用策略模式优化判题机架构
  • MySQL基础篇 - 约束
  • Eclipse Memory Analyzer (MAT)提示No java virtual machine was found ...解决办法
  • Altium Designer脚本的执行方式
  • 【漏洞复现】VEXUS多语言货币交易所存在未授权访问漏洞
  • centos已安装python3.7环境,还行单独安装python3.10环境,如何安装,具体步骤
  • 进程、线程、协程详解:并发编程的三大武器
  • websocket初识
  • 数据集-目标检测系列-兔子检测数据集 rabbit >> DataBall
  • 中国资产“超级星期四”之后,腰部中概股或成增长“黑马”
  • Linux云计算 |【第四阶段】PROJECT2-DAY1
  • 如何使用开发者工具捕获鼠标右键点击事件
  • Tensorflow2.0
  • Spring Boot 进阶-深入了解SpringBoot条件注解
  • VLAN与三层交换机的原理与配置
  • 基于单片机的小车行走加温湿度检测系统
  • 前端框架对比及选择:React、Vue、Angular的深度剖析
  • 图解C#高级教程(一):委托
  • 【MySQL】视图、用户和权限管理
  • JAVA内存模型!=JVM内存模型
  • UI设计师面试整理-工具和技术技能
  • 【大牛!】3DMAX城市交通插件CityTraffic使用方法详解
  • 关于vue2+uniapp+uview+vuex 私募基金项目小程序总结
  • 一文讲清CSS基础之浮动float原理
  • 关于宿主机功能正常docker容器重启后dns失效的解决办法
  • 江科大笔记—LED闪烁 LED流水灯 蜂鸣器