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

leetcode 207. 课程表

题目如下
在这里插入图片描述

数据范围
在这里插入图片描述

做题之前先搞清楚一个概念:拓扑序列
即在一个简单图内找一个入度为0的节点,
删除这个节点并删去与之相连接的边并把这条边连接的节点入度减一(如果存在)。
如此循环往复直到图内不存在节点我们认为拓扑序列存在。
那么在本题中参与课程的要求就是完成前一个课的内容,那么我们要开始第一个课程是不是要找不带前提的课程。即入度为0的课程,那么我们只要重复这个过程只要所有的课程上完了即所有的节点都删了就返回true否则返回false

通过代码(寻找拓扑序列直译版)

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int> du(numCourses,0);
        int count = 0;
      //  bool flag = false;
        int t = -1;
        for(int i = 0;i < prerequisites.size();i++){
            du[prerequisites[i][1]]++;
        }
        while(true){
            for(int i = 0;i < numCourses;i++){
                if(t == -1 && du[i] == 0)t = i;
            }
            if(t == -1){
                if(count == numCourses)return true;
                return false;
            }
            du[t] = -1;
            count++;
            for(int i = 0;i < prerequisites.size();i++){
                if(prerequisites[i][0] == t)du[prerequisites[i][1]]--;
            }
            t = -1;
        }
        if(count != numCourses)return false;
        return true;

    }
};

在这里插入图片描述

那么这个的缺点是什么呢?
显然每次要把入度为0对应的相关点的入度减1还有遍历一整个二维数组。
所以我们牺牲一些空间把每个节点对应相关点存起来就可以避免大量重复计算。

优化时间版

class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int> du(numCourses,0);
        queue<int> q;
        vector<vector<int>> aj(numCourses);
        bool flag = false;
        int n = prerequisites.size();
        int count = 0;
        int t = -1;
        for(int i = 0;i < n;i++){
            du[prerequisites[i][1]]++;
            aj[prerequisites[i][0]].push_back(prerequisites[i][1]);
        }
        for(int i = 0;i < numCourses;i++){
            if(du[i] == 0)q.push(i);
        }
         while(!q.empty()){
            t = q.front();
            q.pop();
            count++;
            for(int i = 0;i < aj[t].size();i++){
              
                    du[aj[t][i]]--;
                    if(du[aj[t][i]] == 0)q.push(aj[t][i]);
                
            }
         }
        

        return count == numCourses;

    }
};

在这里插入图片描述

http://www.dtcms.com/a/35382.html

相关文章:

  • Qt基础之四十九:Qt属性系统(Property System)
  • 【学习笔记】LLM+RL
  • mapbox基础,使用geojson加载fill-extrusion三维填充图层
  • @Async 异步方法,并配置定制线程池
  • GitHub免密操作与跨服务器通行:SSH密钥一站式配置指南
  • ubuntu开机自动挂载硬盘
  • 测试用例的Story是什么?
  • uniapp 微信小程序打包之后vendor.js 主包体积太大,解决办法,“subPackages“:true设置不生效
  • 实战技巧:如何快速提高网站收录的权威性?
  • 23种设计模式之《外观模式(Facade)》在c#中的应用及理解
  • Spring高级篇-Spring IOC容器 Aware 接口
  • 一周热点:马斯克让OpenAI变的更加具有变数
  • 牛客周赛 Round 82(思维、差分、树状数组、大根堆、前后缀、递归)
  • 【Linux知识】Linux上从源码编译到软件安装全过程详细说明
  • 1. EXCEL基础、界面介绍《AI赋能Excel 》
  • 基于TensorFlow.js与Web Worker的智能证件照生成方案
  • C++对象模型之C++额外成本
  • 姜雷从萨满非物质文化传承者到跨界融合的成长历程
  • 51单片机编程学习笔记——点亮LED
  • 初阶数据结构(C语言实现)——1数据结构前言
  • LeetCode刷题零碎知识点整理
  • 2024/2/23 考试
  • js中的await与async的使用
  • react使用拖拽,缩放组件,采用react-rnd解决
  • instanceof和typeof的区别【JavaScript常见面试题】
  • 跨境宠物摄像头是一种专为宠物主人设计的智能设备
  • OpenCV计算摄影学(1)图像修复(Inpainting)的函数inpaint()
  • 【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台
  • P5304 [GXOI/GZOI2019] 旅行者
  • 嵌入式项目:STM32刷卡指纹智能门禁系统