LeetCode课程表打卡(拓扑排序例题)

例题一:LeetCode :207

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程  bi 。

  • 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。

示例 2:

输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
输出:false
解释:总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。

提示:

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • prerequisites[i] 中的所有课程对 互不相同
  • const int N=2010;
    const int M=5010;
    class Solution {
    public:
        int h[N],e[M],ne[M],idx;
        int in[N];
        int cnt;
        void add(int a,int b){
            e[idx]=b,ne[idx]=h[a],h[a]=idx++;
        }
        bool topsort(int n)
        {
            queue<int>q;
            for(int i=0;i<n;i++){
                if(!in[i]){
                    q.push(i);
                    cnt++;
                }
            }
            while(q.size()){
                int t=q.front();
                q.pop();
                for(int i=h[t];~i;i=ne[i]){
                    int j=e[i];
                    in[j]--;
                    if(!in[j]){
                        q.push(j);
                        cnt++;
                    }
                }
            }
            if(cnt==n){
                return true;
            }else{
                return false;
            }
            
    
        }
        bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
            memset(h,-1,sizeof(h));
            for(int i=0;i<prerequisites.size();i++){
                add(prerequisites[i][1],prerequisites[i][0]);
                in[prerequisites[i][0]]++;
            }
            if(topsort(numCourses)){
                return true;
            }else{
                return false;
            }
        }
    };

例题二:LeetCode:210

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

  • 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。

返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:[0,1]
解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。

示例 2:

输入:numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
输出:[0,2,1,3]
解释:总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3]

示例 3:

输入:numCourses = 1, prerequisites = []
输出:[0]

提示:
  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= numCourses * (numCourses - 1)
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • ai != bi
  • 所有[ai, bi] 互不相同
  • const int N=2010;
    const int M=N*(N-1);
    class Solution {
    public:
        int h[N],e[M],ne[M],idx;
        int cnt;
        int in[N];
        vector<int>ans;
        void add(int a,int b){
            e[idx]=b,ne[idx]=h[a],h[a]=idx++;
        }
        bool topsort(int n){
            queue<int> q;
            for(int i=0;i<n;i++){
                if(!in[i]){
                    q.push(i);
                }
            }
            while(q.size()){
                int t=q.front();
                q.pop();
                ans.push_back(t);
                cnt++;
                //cout<<cnt<<endl;
                for(int i=h[t];~i;i=ne[i]){
                    int j=e[i];
                    in[j]--;
                    if(!in[j]){
                        q.push(j);
                    }
                }
            }
            if(cnt==n){
                return true;
            }else{
                return false;
            }
        }
        vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
            vector<int> res;
            memset(h,-1,sizeof(h));
            for(int i=0;i<prerequisites.size();i++){
                add(prerequisites[i][1],prerequisites[i][0]);
                in[prerequisites[i][0]]++;
            }
            if(topsort(numCourses)){
                return ans;
            }else{
                return res;
            }
        }
    };

 

 例题三:LeetCode:1462

你总共需要上 numCourses 门课,课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite ,其中 prerequisites[i] = [ai, bi] 表示如果你想选 bi 课程,你 必须 先选 ai 课程。

  • 有的课会有直接的先修课程,比如如果想上课程 1 ,你必须先上课程 0 ,那么会以 [0,1] 数对的形式给出先修课程数对。

先决条件也可以是 间接 的。如果课程 a 是课程 b 的先决条件,课程 b 是课程 c 的先决条件,那么课程 a 就是课程 c 的先决条件。

你也得到一个数组 queries ,其中 queries[j] = [uj, vj]。对于第 j 个查询,您应该回答课程 uj 是否是课程 vj 的先决条件。

返回一个布尔数组 answer ,其中 answer[j] 是第 j 个查询的答案。

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
输出:[false,true]
解释:[1, 0] 数对表示在你上课程 0 之前必须先上课程 1。
课程 0 不是课程 1 的先修课程,但课程 1 是课程 0 的先修课程。

示例 2:

输入:numCourses = 2, prerequisites = [], queries = [[1,0],[0,1]]
输出:[false,false]
解释:没有先修课程对,所以每门课程之间是独立的。

示例 3:

输入:numCourses = 3, prerequisites = [[1,2],[1,0],[2,0]], queries = [[1,0],[1,2]]
输出:[true,true]

提示:

  • 2 <= numCourses <= 100
  • 0 <= prerequisites.length <= (numCourses * (numCourses - 1) / 2)
  • prerequisites[i].length == 2
  • 0 <= ai, bi <= numCourses - 1
  • ai != bi
  • 每一对 [ai, bi] 都 不同
  • 先修课程图中没有环。
  • 1 <= queries.length <= 104
  • 0 <= ui, vi <= numCourses - 1
  • ui != vi

 这一题没用拓扑排序,用了Floyd,hh。

典型求闭包。

const int N=110;
class Solution {
public:
    int dis[N][N];
    vector<bool> checkIfPrerequisite(int numCourses, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
        memset(dis,0x3f,sizeof(dis));
        vector<bool> ans;
        for(int i=0;i<numCourses;i++){
            dis[i][i]=0;
        }
        for(int i=0;i<prerequisites.size();i++){
            dis[prerequisites[i][0]][prerequisites[i][1]]=0;
        }
        for(int k=0;k<numCourses;k++){
            for(int i=0;i<numCourses;i++){
                for(int j=0;j<numCourses;j++){
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
                }
            }
        }
        for(int i=0;i<queries.size();i++){
            if(!dis[queries[i][0]][queries[i][1]]){
                ans.push_back(true);
            }else{
                ans.push_back(false);
            }
        }
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法速刷(LeetCode)(160.相交链表)

个人思路&#xff1a; 笨蛋做法&#xff0c;但是好用 代码如下 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution …

微信小程序文字转语音播报案例

插件申请 在小程序官方申请同声传译插件&#xff0c;地址&#xff1a; mp.weixin.qq.com 引入插件 在app.json中加入 "plugins": {"WechatSI": {"version": "0.3.6","provider": "wx069ba97219f66d99"}},封装…

Vue入门示例

今天滴学习目标&#xff01;&#xff01;&#xff01; 示例简介HTML内容主体区域输入框列表区域统计和清空 JS引入Vue.js库定义Vue实例el选项data选项methods选项 示例简介 HTML内容 本次实例讲解的是v-for、v-on、v-model来写这小小的实例&#xff0c;下面是实例的效果图&am…

springboot小区物业报修管理系统-计算机设计毕业源码03418

摘 要 本课题的研究对象是小区物业报修管理系统app的设计与实现&#xff0c;该系统实现了用户管理、业主信息管理、报修信息管理、维修记录管理、通知公告管理等功能。本系统在设计上&#xff0c;考虑到系统内容以及系统的受众群体&#xff0c;在系统的美工方面采用了比较正规的…

【JavaEE】【多线程】单例模式

目录 一、设计模式1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式 1.2 线程安全问题1.3 懒汉模式线程安全问题的解决方法1.3.1 原子性问题解决1.3.2 解决效率问题1.3.3 解决内存可见性问题和指令重排序问题 一、设计模式 在讲解案例前&#xff0c;先介绍一个概念设计模式&#xff…

【开源免费】基于SpringBoot+Vue.JS母婴商城系统 (JAVA毕业设计)

本文项目编号 T 030 &#xff0c;文末自助获取源码 \color{red}{T030&#xff0c;文末自助获取源码} T030&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

力扣 简单 111.二叉树的最小深度

文章目录 题目介绍题解 题目介绍 题解 最小深度&#xff1a;从根节点到最近叶子结点的最短路径上节点数量。 分三种情况讨论即可&#xff1a; 当前节点为空&#xff0c;则返回当前节点minDepth0&#xff1b;当前节点左右子树都存在&#xff0c;则返回当前节点minDepth 左右子…

【Unity踩坑】如何关闭项目中的Version Control (Plastic SCM)

Unity官方提供了版本控制Version Control&#xff08;即原来的Plastic SCM)&#xff0c;虽然方便&#xff0c;但是在不同的电脑上同步时&#xff0c;会出现项目不一致的问题。因为只是少数几个人使用&#xff0c;那还不如直接使用Git或SVN来管理。 而且最近发现有一个bug还与P…

Docker 部署 EMQX 一分钟极速部署

部署 EMQX ( Docker ) [Step 1] : 拉取 EMQX 镜像 docker pull emqx/emqx:latest[Step 2] : 创建目录 ➡️ 创建容器 ➡️ 拷贝文件 ➡️ 授权文件 ➡️ 删除容器 # 创建目录 mkdir -p /data/emqx/{etc,data,log}# 创建容器 docker run -d --name emqx -p 1883:1883 -p 1808…

RBM(HA透明主备直路由)

1. 组网需求 如图1-23所示&#xff0c;某公司以Device作为网络边界安全防护设备&#xff0c;连接公司内部网络和Internet&#xff0c;Device的上、下行业务接口均为二层接口。为提高业务稳定性&#xff0c;使用两台Device进行HA组网&#xff0c;Device A作为主设备&#xff0c…

CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)

CSS3 动画相关属性实例大全&#xff08;三) &#xff08;columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性&#xff09; 本文目录&#xff1a; 一、columns属性&#xff08;设置元素的列宽和列数&#xff09; 二、filter属性&#xff08;调整图像、背景和边…

C++第八讲:STL--stack和queue的使用及模拟实现

C第八讲&#xff1a;STL--stack和queue的使用及模拟实现 1.stack的使用2.queue的使用3.栈和队列OJ题3.1题目1&#xff1a;最小栈3.2题目2&#xff1a;栈的压入、弹出序列3.3题目3&#xff1a;逆波兰表达式求值3.4题目4&#xff1a;用栈实现队列 4.栈的模拟实现5.队列的模拟实现…

某大型液压企业干部职业化项目纪实

某大型液压企业干部职业化项目纪实 ——引入三级职能分解&#xff0c;监督检查标准化 【导读】 企业逐渐发展&#xff0c;人员规模逐渐扩大的同时&#xff0c;中层管理者的数量也大幅增加&#xff0c;但是&#xff0c;管理人员增加了&#xff0c;管理问题却越来越多。公司很…

国产标准数字隔离器的未来---克里雅半导体

标准数字隔离器是电信号隔离技术的重要组成部分&#xff0c;近年来取得了重大进展。随着工业自动化、汽车电子和电信等行业对更高性能的需求不断增长&#xff0c;国内数字隔离器制造商正在稳步赶上全球标准。本文讨论了数字隔离器技术的新兴趋势、材料创新的影响&#xff0c;以…

3.cpp基本数据类型

cpp基本数据类型 1.cpp基本数据类型 1.cpp基本数据类型 C基本数据类型和C语言的基本数据类型差不多 注意bool类型&#xff1a;存储真值 true 或假值 false&#xff0c;C语言编译器C99以上支持。 C语言的bool类型&#xff1a;要添加 #include <stdbool.h>头文件 #includ…

考研读研生存指南,注意事项

本视频&#xff0c;涉及考研读研的方方面面&#xff0c;从考研初试→复试面试→研究生生活→导师相处→论文专利写作混毕业&#xff0c;应有尽有。有了他&#xff0c;你的研究生生涯稳了。 读研考研注意事项&#xff0c;研究生生存指南。_哔哩哔哩_bilibili 一、考研初试注意事…

“声音”音源设置和音效播放

学习如何使用音效系统&#xff0c;背景音乐和其他特别的音效&#xff0c;跳跃攻击等等 学习如何在unity当中使用整套的音效系统&#xff0c;使用之前&#xff0c;我们先来确定一下我们要使用的音乐和音效&#xff0c;在Unity Asset Store当中搜索&#xff0c;添加到我们的unit…

ICP许可证网站模板审核专用下载

ICP许可证网站模板审核专用下载 在当今的数字化时代&#xff0c;互联网的合规性变得尤为重要&#xff0c;特别是在中国。ICP许可证&#xff0c;即互联网信息服务业务经营许可证&#xff0c;是经营性网站必须持有的合法证件。为了帮助网站快速达到合规要求&#xff0c;选择合适…

出海IAA产品如何提升广告展示率?

大家好&#xff0c;我是牢鹅&#xff01;对于出海有做IAA的开发者来说&#xff0c;收益的增长至关重要。而广告收益&#xff0c;又与广告展示率息息相关。 牢鹅根据自身经验和AdMob的一些公开资料&#xff0c;总结了下面几点和提升广告展示率的方法&#xff0c;大家可以对照进…

在不支持AVX的linux上使用PaddleOCR

背景 公司的虚拟机CPU居然不支持avx, 默认的paddlepaddle的cpu版本又需要有支持avx才行,还想用PaddleOCR有啥办法呢? 是否支持avx lscpu | grep avx 支持avx的话,会显示相关信息 如果不支持的话,python运行时导入paddle会报错 怎么办呢 方案一 找公司it,看看虚拟机为什么…