leetcode(力扣) 207. 课程表1+2(图的构造与遍历,清晰思路,完整模拟)

文章目录

  • 题目描述
  • 思路分析
  • 完整代码

题目描述

你这个学期必须选修 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 。这是不可能的。

思路分析

先构造图思路。
假设有:[[3, 0], [3, 1], [4, 1], [4, 2], [5, 3], [5, 4]]

则构造图:
在这里插入图片描述
也就是说:

  • 每次只能选入度为 0 的课,因为它不依赖别的课,是当下你能上的课。
  • 假设选了 0,课 3 的先修课少了一门,入度由 2 变 1。
  • 接着选 1,导致课 3 的入度变 0,课 4 的入度由 2 变 1。
  • 接着选 2,导致课 4 的入度变 0。
  • 现在,课 3 和课 4 的入度为 0。继续选入度为 0 的课……直到选不到入度为 0 的课。

所以现在的思路就很简单了,所有入度为0的节点都是可以直接学习的课。

我们只需要先设置两个数组chudu和rudu,记录入度和出度情况。

比如对于:[[1,0],[2,0],[3,1],[3,2]]
则:
chudu = [[1, 2], [3], [3], []] 即 i号课的出度指向 chudu[i]
rudu = [0, 1, 1, 2] 即 i号课的入度有rudu[i]个课。

直接代码构造这俩数组:

        for i in prerequisites:chudu[i[1]].append(i[0])rudu[i[0]]+=1

然后构造一个队列,将所有入度为0的课加入。

for i in range(len(rudu)):if rudu[i] == 0:queue.append(i)

后面就简单了,比如有[1,2] ,图表示就是2->1。

  • 此时2的入度为0,则2被加入队列中,拿出队列中的2,看看2是谁的入度
  • 显然2是1的入度,所以要将1的入度数减去1
  • -当1的入度数为0的时候,表示1也是可以学习的课了,将1也加入到队列中。

第二道题 就是课程表2,实际上和课程表1 基本一样。课程表1是计数,然后和题目所给的numCourses 做比较,在课程表2中更改一下,设置一个res答案数组,直接在count计数的位置变成记录答案数组就行了。

完整代码

### 课程表1
class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:# 构造出入度列表chudu = [[] for x in range(numCourses)]rudu = [0]*numCoursesqueue = []count = 0for i in prerequisites:# 添加依赖它的后续课chudu[i[1]].append(i[0])rudu[i[0]] += 1for i in range(numCourses):if rudu[i] == 0:queue.append(i)while queue != []:  for i in range(len(queue)):temp = queue.pop(0)count += 1for x in chudu[temp]:rudu[x] -= 1if rudu[x] == 0:queue.append(x)return count==numCourses### 课程表2
class Solution:def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:rudu = [0] * numCourseschudu = [[] for _ in range(numCourses)]queue = []res = []for i in prerequisites:chudu[i[1]].append(i[0])rudu[i[0]]+=1print(chudu,rudu)for i in range(len(rudu)):if rudu[i] == 0:queue.append(i)while queue!=[]:for i in range(len(queue)):temp = queue.pop()    # temp号课已经学习了res.append(temp)for j in chudu[temp]: # 遍历所有以temp为前置的课rudu[j]-=1if rudu[j] == 0:queue.append(j)return res if len(res) == numCourses else []

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矢量绘图软件Sketch 99 for mac

Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员,帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面,以及丰富的功能集,使得用户可以轻松地创建、编辑和共享精美的…

openai自定义API操作 API 返回值说明

custom-自定义API操作 openai.custom 公共参数 名称类型必须描述keyString是调用key(获取测试key)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheStrin…

轻量日志管理方案-[EFK]

使用FileBeat进行日志文件的数据收集,并发送到ES进行存储,最后Kibana进行查看展示; 这个应该是最简单,轻量的日志收集方案了。 最总方案为:FileBeatESKibana ; 【Kibana过于强大,感觉可以无限扩展】 文章目…

Apinto 网关进阶教程,使用 API Mock 生成模拟数据

什么是 API Mock ? API Mock 是一种技术,它允许程序员在不依赖后端数据的情况下,模拟 web服务器端 API 的响应。通常使用 API Mock 来测试前端应用程序,而无需等待后端程序构建完成。API Mock 可以模拟任何 HTTP 请求方法&#x…

linux安装nodejs

写在前面 因为工作需要,需要使用到nodejs,所以这里简单记录下学习过程。 1:安装 wget https://nodejs.org/dist/v14.17.4/node-v14.17.4-linux-x64.tar.xz tar xf node-v14.17.4-linux-x64.tar.xz mkdir /usr/local/lib/node // 这一步骤根…

使用电脑时提示msvcp140.dll丢失的5个解决方法

“计算机中msvcp140.dll丢失的5个解决方法”。在我们日常使用电脑的过程中,有时会遇到一些错误提示,其中之一就是“msvcp140.dll丢失”。那么,什么是msvcp140.dll呢?它的作用是什么?丢失它会对电脑产生什么影响呢&…

人工智能基础_机器学习022_使用正则化_曼哈顿距离_欧氏距离_提高模型鲁棒性_过拟合_欠拟合_正则化提高模型泛化能力---人工智能工作笔记0062

然后我们再来看一下,过拟合和欠拟合,现在,实际上欠拟合,出现的情况已经不多了,欠拟合是 在训练集和测试集的准确率不高,学习不到位的情况. 然后现在一般碰到的是过拟合,可以看到第二个就是,完全就把红点蓝点分开了,这种情况是不好的, 因为分开是对训练数据进行分开的,如果来…

如何将NetCore Web程序独立发布部署到Linux服务器

简介 在将 .NET Core 应用程序部署到 Linux 服务器上时,可以采用独立发布的方式,以便在目标服务器上运行应用程序而无需安装 .NET Core 运行时。本文介绍如果将NetCore Web程序独立发布部署到Linux服务器。 1、准备一台服务器 服务器配置:2核2G 系统环境:Alibaba Cloud…

可视化技术专栏100例教程导航帖—学习可视化技术的指南宝典

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文专栏:可视化技术专栏100例 可视化技术专栏100例领略各种先进的可视化技术,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章…

1994-2021年分行业二氧化碳排放量数据

1994-2021年分行业二氧化碳排放量数据 1、时间:1994-2021年 2、来源:原始数据整理自能源年鉴 3、指标:统计年度、行业代码、行业名称、煤炭二氧化碳排放量、焦炭二氧化碳排放量、原油二氧化碳排放量、汽油二氧化碳排放量、煤油二氧化碳排放…

【Python】AppUI自动化—appium自动化元素定位、元素事件操作(17)下

文章目录 前言一.Appium 元素定位1.定位方式种类2.如何定位2.1 id定位2.2 className定位2.3 content-desc 定位2.4 Android Uiautomator定位4.1 text定位4.2 text模糊定位4.3 text正则匹配定位4.4 resourceId定位4.5 resourceId正则匹配定位4.6 className定位4.7 className正则…

Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5)

Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5) import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import android.view.…