力扣--课程表--bfs+dfs

整体思路:

 这是一道拓扑序列的题目,我们将边的方向定义成从先修课指向后修课的方向,借一下官方的题解图片,我们需要判断的是形成的这个图结构是否存在环,如果存在环,那么代表不能完成所有课程的学习。

bfs思路:

首先将每个点的入度数记录到hmap中,将每个点的后续节点记录到record中(record是一个unordered_map<int,vector<int>>结构,指的是某个节点指向的后续节点),首先遍历hmap中所有入度为0的节点,说明这些课程不需要先修课,他们可以直接被修完。将这些节点去掉,并且将该节点的后续节点的hmap值-1。再次遍历hmap,去掉入度数为0的节点....用什么结构来实现这个过程呢?队列~

代码:

C++:
class Solution {
public:
    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        //广度优先搜索---记录入度
        unordered_map<int,int> hmap;
        unordered_map<int,vector<int>> record; //记录该门课程的后续课程
        int cnt=0;
        //初始化hmap,record
        for(int i=0;i<numCourses;i++){
            hmap[i]=0;
        }
        int len=prerequisites.size();
        for(int i=0;i<len;i++){
            int a=prerequisites[i][0];
            int b=prerequisites[i][1];
            hmap[a]+=1;
            record[b].push_back(a);
        }

        //将
        deque<int> q;
        //初始化q
        unordered_map<int,int>::iterator iter=hmap.begin();

        for(auto iter:hmap){
            if(iter.second==0){
                q.push_back(iter.first);
                hmap[iter.first]=-1;
            }
        }
        //
        while(!q.empty()){
            int p=q.front();  //该点入度为0,可删除
            q.pop_front();
            cnt++;
            int len=record[p].size();
            for(int i=0;i<len;i++){
                hmap[record[p][i]]--;
            }
            for(auto iter:hmap){
                if(iter.second==0){
                    q.push_back(iter.first);
                    hmap[iter.first]=-1;
                }
            }
        }
        if(cnt==numCourses){
            return true;
        }
        else{
            return false;
        }
    }
};

注意这句代码:

unordered_map<int,int>::iterator iter=hmap.begin();
Python:
class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        hmap=[0]*numCourses
        len_pre=len(prerequisites)
        record=[[] for i in range(numCourses)]
        cnt=0

        for i in range(len_pre):
            a=prerequisites[i][0]
            b=prerequisites[i][1]
            hmap[a]+=1
            record[b].append(a)
        
        q=deque()
        for index,value in enumerate(hmap):
            if value==0:
                q.append(index)
                hmap[index]=-1
        
        while q:
            p=q[0]
            q.popleft()
            cnt+=1
            len_=len(record[p])
            for i in range(len_):
                hmap[record[p][i]]-=1
            for index,value in enumerate(hmap):
                if value==0:
                    q.append(index)
                    hmap[index]=-1
        if cnt==numCourses:
            return True
        else:
            return False

Python中的deque需要 from collections import deque

注意这句代码:(替代vector<vector<int>>)

record=[[] for i in range(numCourses)] #正确
record=[[]]* numCourses  #错误

注意这句代码:(替代key为索引的字典/替代需要查找索引的list)

for index,value in enumerate(hmap):

dfs思路:

我们利用hmap来记录节点 i 的邻接节点,利用flag来记录节点的状态(flag=0代表该点未被dfs,flag=1代表该点正在被路上的节点dfs,flag=-1代表该点已被其他节点dfs)。

大致dfs的思路是这样的(以节点 i 开始),首先判断节点 i 是否被其他节点 dfs(即flag=1),如果成立,则说明暂时无环,返回false。其次判断节点 i 是否属于正在被路上节点dfs,如果成立,则代表有环,返回true。如果该点未被访问,将该点的邻接节点依次遍历,遍历中如果有环,返回true,如果无环,将 i 节点的flag值记为-1。

代码:

C++:
class Solution {
public:

    bool dfs(int i,unordered_map<int,vector<int>>& hmap,vector<int>& flag){
        //以第i个点为起点
        //有环返回true,无环返回false
        if(flag[i]==1){return true;}
        if(flag[i]==-1){return false;}
        flag[i]=1;
        int len=hmap[i].size();
        for(int j=0;j<len;j++){
            if(dfs(hmap[i][j],hmap,flag)){
                return true;
            }
        }
        flag[i]=-1;
        return false;
    }

    bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
        int len=prerequisites.size();
        unordered_map<int,vector<int>> hmap;
        for(int i=0;i<len;i++){
            hmap[prerequisites[i][1]].push_back(prerequisites[i][0]);
        }
        vector<int> flag(numCourses,0);
        for(int i=0;i<numCourses;i++){
            if(dfs(i,hmap,flag)){
                return false;
            }
        }
        return true;
    }
};

Python:

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        def dfs(i,hmap:List[List[int]],flag:List[int]) -> bool:
            if flag[i]==1:
                return True
            if flag[i]==-1:
                return False
            flag[i]=1
            len_hmap=len(hmap[i])
            for j in range(len_hmap):
                if dfs(hmap[i][j],hmap,flag):
                    return True
            flag[i]=-1
            return False

        len_pre=len(prerequisites)
        hmap=[[]for _ in range(numCourses)]
        for j in range(len_pre):
            hmap[prerequisites[j][1]].append(prerequisites[j][0])
        flag=[0]*numCourses
        for j in range(numCourses):
            if(dfs(j,hmap,flag)):
                return False
        return True

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

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

相关文章

2.Datax数据同步之Windows下,mysql和sqlserver之间的自定义sql文数据同步

目录 前言步骤操作大纲步骤明细mysql 至 sqlServersqlServer 至 mysql执行同步语句中报 前言 上一篇文章实现了不同的mysql数据库之间的数据同步&#xff0c;在此基础上本篇将实现mysql和sqlserver之间的自定义sql文数据同步 准备工作&#xff1a; JDK(1.8以上&#xff0c;推…

学习vue3第四节(ref以及ref相关api)

主要记录以下api&#xff1a;ref()、isRef()、unref()、 shallowRef()、triggerRef()、customRef() 1、ref() 定义 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value&#xff0c;.value属性用于追踪并且存…

数据结构 第1章:绪论

文章目录 1. 绪论1.1. 数据结构 1.2. 算法1.2.1. 算法的基本概念1.2.2. 算法的时间复杂度1.2.3. 算法的空间复杂度 1. 绪论 程序 数据结构 算法 1.1. 数据结构 数据&#xff1a;是对客观事物的符号表示&#xff0c;在计算机科学中是指所有能输入到计算机中并被计算机程序处理…

记录一个Typora激活方法(附软件)!!!

前言 今天想体验Typora上的picList功能&#xff0c;手一抖给版本升级到最新的1.8.10&#xff0c;然后就提示我激活&#xff0c;让我输入序列号&#xff0c;如图所示。接着我就去百度找教程&#xff0c;于是乎就出现了这一篇文章。 教程开始 1、下载最新版 先去官网下载最新…

使用canvas绘制超炫时钟

HTML5 Canvas相当于一个画板&#xff0c;你可以在Canvas绘制任意的东西&#xff0c;今天要分享一款利用HTML5 Canvas绘制的超炫时钟的方法及代码&#xff0c;非常的漂亮&#xff0c;这里推荐给大家 代码地址 使用canvas绘制超炫时钟

R统计学2 - 数据分析入门问题21-40

往期R统计学文章&#xff1a; R统计学1 - 基础操作入门问题1-20 21. 如何对矩阵按行 (列) 作计算&#xff1f; 使用函数 apply() vec 1:20 # 转换为矩阵 mat matrix (vec , ncol4) # [,1] [,2] [,3] [,4] # [1,] 1 6 11 16 # [2,] 2 7 12 17 # [3,] …

Nodejs 第五十四章(net)

net模块是Node.js的核心模块之一&#xff0c;它提供了用于创建基于网络的应用程序的API。net模块主要用于创建TCP服务器和TCP客户端&#xff0c;以及处理网络通信。 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;用于…

word中图片位置问题(后续遇到问题再更新)

问题1&#xff1a;图片插入后显示不全 具体表现为&#xff1a;复制黏贴、或者插入图片后&#xff0c;出现插入的图片显示不全&#xff0c;或者不显示。 例如&#xff1a; 这是因为&#xff1a;图片被设定了固定行距 解决方案&#xff1a;ctrl1 效果&#xff1a; 问题2&am…

2024蓝桥杯每日一题(二分)

一、第一题&#xff1a;教室 解题思路&#xff1a;二分差分 对天数进行二分&#xff0c;在ck函数中用差分方法优化多次区间累加。 【Python程序代码】 n,m map(int,input().split()) a [0] list(map(int,input().split())) d,s,t [0]*(m5),[0]*(m5),[0]*(m5) for…

Trust Region Policy Optimization (TRPO)

Trust Region Policy Optimization (TRPO) 是一种强化学习算法&#xff0c;专门设计来改善策略梯度方法在稳定性和效率方面的表现。由 John Schulman 等人在 2015 年提出&#xff0c;TRPO 的核心思想是在策略优化过程中引入一个信任区域&#xff08;trust region&#xff09;&a…

unity

Unity官方下载_Unity最新版_从Unity Hub下载安装 | Unity中国官网 Unity Remote - Unity 手册 登陆账号&#xff0c;找到一个3d 免费资源 3D Animations & Models | Unity Asset Store unity 里面window->package Manager 里面可以看到自己的asset &#xff0c;下载后…

【数据结构】顺序表的定义及实现方式

文章目录 顺序表的定义顺序表的实现静态分配动态分配动态申请内存空间&#xff0c;动态释放内存空间&#xff08;malloc&#xff0c;free&#xff09; 顺序表的特点总结 顺序表的定义 顺序表也就是用顺序存储的方式实现线性表。 顺序存储。把逻辑上相邻的元素存储在物理位置上…

kubernetes之概念入门篇

K8S的内容是要比docker多很多的。 kubernetes中文官网&#xff1a; Kubernetes(K8S)中文文档_Kubernetes中文社区 1、认识kubernetes 1.1、什么是kubernetes&#xff1f; kubernetes是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;kubernetes…

漏洞发现-漏扫项目篇NucleiYakitGobyAfrogXrayAwvs联动中转被动

知识点 1、综合类-Burp&Xray&Awvs&Goby 2、特征类-Afrog&Yakit&Nuclei 3、联动类-主动扫描&被动扫描&中转扫描 章节点&#xff1a; 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动…

探索TikTok云手机在社交媒体营销的作用

近年来&#xff0c;TikTok作为全球短视频平台之一&#xff0c;其用户基数呈现持续增长的趋势。伴随社交媒体的蓬勃发展&#xff0c;企业和个人纷纷涌入TikTok平台&#xff0c;追求更广泛的曝光和用户互动。为满足这一需求&#xff0c;TikTok云手机应运而生。本文将深度剖析TikT…

力扣面试经典150 —— 16-20题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 16. [困难] 接…

nginx有几种启动方式

Nginx 通常可以以两种主要的方式启动&#xff1a;作为前台进程运行或作为守护进程&#xff08;后台&#xff09;运行。 前台运行&#xff1a; 当Nginx以前台模式运行时&#xff0c;它会在命令行保持活动状态&#xff0c;所有的日志输出都会直接显示在命令行上。这种模式通常用于…

execl/python读取数据库( Access、MySQL)

目录 一 、读取access数据库 &#xff08;一&#xff09;execl读取数据库 1.搜索ODBC&#xff08;注意自己的execl是64位还是32位&#xff09; 2.安装数据源的驱动程序 3.打开execl 4. 补充&#xff1a;选择数据源时&#xff0c;也可以直接在execl中选择数据源 &#xff…

丘一丘正则表达式

正则表达式(regular expression,regex,RE) 正则表达式是一种用来简洁表达一组字符串的表达式正则表达式是一种通用的字符串表达框架正则表达式是一种针对字符串表达“简洁”和“特征”思想的工具正则表达式可以用来判断某字符串的特征归属 正则表达式常用操作符 操作符说明实…

linux 模拟shell

&#x1f493;博主CSDN主页:麻辣韭菜-CSDN博客&#x1f493;   ⏩专栏分类&#xff1a;http://t.csdnimg.cn/G90eI⏪   &#x1f69a;代码仓库:Linux: Linux日常代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d;&#x1f5…