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

做印刷品去哪个网站北京网站优化专家

做印刷品去哪个网站,北京网站优化专家,dw做的网站怎么全屏,开发施工建设网站审核题目: 这个学期必须选修numCourses门课程,记为0到numCourse-1 在选修某些课程之前需要一些先修课程。先修课程按数组prerequisites给出,其中prerequisites[i] [ai, bi],表示如果要学习课程ai,则必须先学习课程b1。 例如&#…

题目:

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

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

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

请判断是否可能完成所有课程的学习?如果可以,返回True,否则,返回False

 


 


方法一:深度优先搜索

以出度为0进行优先搜索 

如果某一门课程的出度为0表示为相对高阶的课程,出度不为0表示它一定是其他某些课程的先修课程,由浅入深,优先寻找高阶的课程,引入三个状态,依次寻找高阶课程。并将连接它的低阶课程出度减去1,为0后即入栈。依次进行。栈的顺序是先入后出,所以高阶课程是后学习的

import collectionsclass Solution:def canFinish(self, numCourses, prerequisites):""":type numCourses: int:type prerequisites: List[List[int]]:rtype: bool"""edges=collections.defaultdict(list)#存储课程的依赖关系visited=[0]*numCourses #记录访问状态0:未访1:正在访问(递归栈中)2:已访问完成result=[]#存储拓扑排序的结果self.valid=True#表示是否可以完成所有课程,初始化为 Truefor info in prerequisites:edges[info[1]].append(info[0])#将 (b -> a) 关系存入邻接表def dfs(u):  #遍历 u 及其所有依赖课程if not self.valid: #如果 self.valid 变为 False,则直接返回return visited[u]=1 #状态设为1for v in edges[u]:if visited[v]==0: #如果 v 未访问(visited[v] == 0),递归调用dfs(v)if not self.valid:returnelif visited[v]==1: #如果 v 正在访问(visited[v] == 1),说明检测到环self.valid=Falsereturnvisited[u]=2result.append(u)for i in range(numCourses): #遍历 numCourses 中的每个课if self.valid and visited[i]==0: #如果 i 未被访问,并且为Truedfs(i)return self.valid

 时间复杂度:O(m+n)n 为课程数,m 为先修课程的要求数。

空间复杂度:O(m+n)需要存储成邻接表的形式,空间复杂度为 O(n+m)。在深度优先搜索的过程中,我们需要最多 O(n) 的栈空间(递归)进行深度优先搜索,因此总空间复杂度为 O(n+m)


方法二:广度优先搜索

 新建一个数组,课程序号作为索引,先修课程的数目入度作为值,入度为0表示先修课程已经完成,或者没有先修课程,现在可以学习这门课程。新建一个队列,将当前可以学习的课程即入度值为0的课程,加入队列中。先学习C1,则以C1为入度的课程值可以减1,C3和C8的入度值减1,此时C8的值为0,将其加入带学习的对列。开始学习C2,C2学习完后,C3,C5减去1,C3,C5的入度为0,加入待学习的对列。重复此过程,将入度为0 的课程加入待学习的队列,直到所有课程学习结束。

import collectionsclass Solution:def canFinish(self, numCourses, prerequisites):""":type numCourses: int:type prerequisites: List[List[int]]:rtype: bool"""edges=collections.defaultdict(list)#构建一个默认字典,键是课程编号,值是该课程的后继课程列表,defaultdict,确认访问不存在的键时不会报错,而是自动创建一个空列表indeg=[0]*numCourses #存储每门课程的入度,即该课程需要的先修课程的数量,初始化为0for info in prerequisites:#遍历课程数组,他是二维的【【a,b】】,学习 a 需要先学习 bedges[info[1]].append(info[0]) #b->aindeg[info[0]]+=1 #a 的入度 +1q=collections.deque([u for u in range(numCourses) if indeg[u]==0])#入度为 0 的节点入队visited=0 #记录访问的课程数while q:visited+=1 # # 每出队一个节点,表示完成了一门课程u=q.popleft()  #取出队首节点for v in edges[u]:# 遍历所有相邻节点indeg[v]-=1 # 依赖于 u 的课程入度 -1if indeg[v]==0:#如果某门课程入度变为 0,说明可以学习q.append(v) # 加入队列return visited==numCourses ## 如果所有课程都能被访问,说明可以完成所有课程

 时间复杂度:O(m+n)n 为课程数,m 为先修课程的要求数。

空间复杂度:O(m+n)需要存储成邻接表的形式,空间复杂度为 O(n+m)。在深度优先搜索的过程中,我们需要最多 O(n) 队列空间迭代进行广度优先搜索,因此总空间复杂度为 O(n+m)

源自力扣官方题解

http://www.dtcms.com/wzjs/421802.html

相关文章:

  • 英文网站建设技术身边的网络营销案例
  • 学校网站开发的项目背景上海百度竞价
  • 自己做的网站怎么放上网提高百度搜索排名
  • 秒速网站建设免费b2b信息发布网站
  • 做互联网的网站百度地图疫情实时动态
  • 广州十大网站建设宝安网站建设
  • 在线网站模板网站安全检测在线
  • 汕头制作网站软件百度关键词点击工具
  • 恒信在线做彩票的是什么样的网站培训心得体会模板
  • 自助网站建设程序百度的人工客服
  • 做简历模板的网站都有哪些福州seo网站管理
  • 揭阳网站制作价格爱站网站长百度查询权重
  • 网上注册公司需要多长时间百度seo教程
  • 苏州制作网站的有几家网址安全中心检测
  • 适合写个人博客的平台沧州网站优化公司
  • wordpress 香港主机seo交流论坛
  • 软件开发专业就业前景如何优化大师的三大功能
  • 郑州营销型网站建设哪家好百度免费安装
  • html电影网站模板优化百度百科
  • 做网站设计要适配到手机端么公司seo是什么意思
  • 梅州网站建设市场调研报告1000字
  • 家里笔记本做网站 怎么解析专业搜索引擎seo公司
  • 做地方门户网站赚钱吗深圳seo公司
  • 外贸网站设计与推广抖音seo排名优化公司
  • 网站注册域名查询灰色词快速上排名
  • 进出口贸易网搜索引擎关键词优化有哪些技巧
  • 前端和网站建设的区别投放广告找什么平台
  • 学做美食的视频网站有哪些tool站长工具
  • org做后缀的网站seoul是什么国家
  • 炫丽的网站成人教育培训机构排名