leetcode 207. 课程表

ops/2025/2/25 15:48:43/

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

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

做题之前先搞清楚一个概念:拓扑序列
即在一个简单图内找一个入度为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.ppmy.cn/ops/161231.html

相关文章

【Deepseek+Dify】wsl2+docker+Deepseek+Dify部署本地大模型知识库问题总结

wsl2dockerDeepseekDify部署本地大模型知识库问题总结 基于ollama部署本地文本模型和嵌入模型 部署教程 DeepSeekdify 本地知识库&#xff1a;真的太香了 问题贴&#xff1a;启动wsl中docker中的dify相关的容器 发现postgre服务和daemon服务一直在重启&#xff0c;导致前端加…

云计算该如何实现高效数据存储和处理?

云计算可以为企业提供一个强大的平台&#xff0c;帮助企业实现高效的数据存储和处理&#xff0c;云计算有着高度的灵活性和可扩展性&#xff0c;为用户与企业提供高效的资源管理和实时数据处理能力&#xff0c;一下就是云计算该如何实现高效数据存储和处理的几个方面&#xff1…

Linux基础开发工具的使用(apt、vim、gcc、g++、gdb、make、makefile)

Linux软件包管理器–apt Linux安装软件的方式 在Linux下安装软件的方法有以下三种&#xff1a; 下载到程序的源代码&#xff0c;自己编译出可执行程序获取deb安装包、然后使用dpkg命令安装。&#xff08;不解决依赖关系&#xff09;通过apt进行安装软件。 小知识点&#xf…

4. Spring Cloud Gateway 入门与使用

一、什么是网关? 网关是一种网络设备&#xff0c;用于连接两个或多个不同网络&#xff0c;将数据从一个网络转发到另一个网络。它充当了两个网络之间的桥梁&#xff0c;负责转发数据并处理来自不同网络的通信协议转换。 二、网关有什么用? 网关的主要作用有以下几个: 路由…

Flutter - StatefulWidget (有状态的 Widget) 和 生命周期

StatefulWidget /*** 需求&#xff1a;* 两个按钮&#xff0c;一个计数器* 这里要用到 StatefulWidget,因为 StatelessWidget 通常用来展示固定不变的数据*/ main() > runApp(MyApp());class MyApp extends StatelessWidget {overrideWidget build(BuildContext context) {…

Openwrt路由器操作系统

一、什么是 OpenWrt&#xff1f; OpenWrt 是一个基于 Linux 的开源操作系统&#xff0c;主要设计用于嵌入式设备&#xff0c;尤其是路由器。与其说是传统的路由器固件&#xff0c;不如说它是一个路由器操作系统。 传统的路由器固件通常由路由器厂商开发&#xff0c;功能相对固…

AI写代码工具赋能前端开发:高效学习与应用AI前端框架

近年来&#xff0c;人工智能技术飞速发展&#xff0c;深刻地改变着软件开发的模式。在前端开发领域&#xff0c;AI写代码工具的兴起更是掀起了一场革命&#xff0c;为开发者带来了前所未有的效率提升和全新的开发体验。掌握AI前端框架已不再是锦上添花&#xff0c;而是提升竞争…

在LangFlow中集成OpenAI Compatible API类型的大语言模型

一、背景与核心价值 从Dify换到这个langflow真的时各种的不适应啊。 就比如这个OpenAI Compatible API,这不应该是基本操作嘛? 算了,服了,习惯了就好了。咱闲言少叙,正片开始: LangFlow作为LangChain的可视化开发工具,其最大优势在于无需编写代码即可构建复杂的大模型…