Golang每日一练(leetDay0072) 课程表 I\II Course Schedule

news2024/11/24 0:04:37

目录

1. 课程表 Course Schedule I  🌟🌟

2. 课程表 Course Schedule II  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 课程表 Course Schedule I

你这个学期必须选修 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 <= 10^5
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • prerequisites[i] 中的所有课程对 互不相同

代码1: DFS

package main

import "fmt"

func canFinish(numCourses int, prerequisites [][]int) bool {
	// 构建邻接表
	graph := make([][]int, numCourses)
	for _, p := range prerequisites {
		graph[p[1]] = append(graph[p[1]], p[0])
	}

	// DFS 遍历找环
	visited := make([]bool, numCourses)
	for i := 0; i < numCourses; i++ {
		if !dfs(i, graph, visited) {
			return false
		}
	}

	return true
}

func dfs(node int, graph [][]int, visited []bool) bool {
	if visited[node] {
		return false
	}

	visited[node] = true
	for _, n := range graph[node] {
		if !dfs(n, graph, visited) {
			return false
		}
	}
	visited[node] = false

	return true
}

func main() {
	numCourses := 2
	prerequisites := [][]int{{1, 0}}
	fmt.Println(canFinish(numCourses, prerequisites))
	prerequisites = [][]int{{1, 0}, {0, 1}}
	fmt.Println(canFinish(numCourses, prerequisites))
}

 代码2: BFS 拓扑排序

package main

import "fmt"

func canFinish(numCourses int, prerequisites [][]int) bool {
	// 建图,统计入度
	graph := make([][]int, numCourses)
	inDegree := make([]int, numCourses)
	for _, p := range prerequisites {
		graph[p[1]] = append(graph[p[1]], p[0])
		inDegree[p[0]]++
	}

	// 将入度为 0 的结点加入队列中
	queue := make([]int, 0)
	for i := 0; i < numCourses; i++ {
		if inDegree[i] == 0 {
			queue = append(queue, i)
		}
	}

	// BFS 遍历图
	for len(queue) > 0 {
		node := queue[0]
		queue = queue[1:]
		numCourses--

		for _, n := range graph[node] {
			inDegree[n]--
			if inDegree[n] == 0 {
				queue = append(queue, n)
			}
		}
	}

	return numCourses == 0
}

func main() {
	numCourses := 2
	prerequisites := [][]int{{1, 0}}
	fmt.Println(canFinish(numCourses, prerequisites))
	prerequisites = [][]int{{1, 0}, {0, 1}}
	fmt.Println(canFinish(numCourses, prerequisites))
}

输出:

true
false


2. 课程表 Course Schedule II

现在你总共有 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] 互不相同

代码1: DFS 

package main

import "fmt"

func findOrder(numCourses int, prerequisites [][]int) []int {
	// 构建邻接表和标记数组
	graph := make([][]int, numCourses)
	marks := make([]int, numCourses)
	for _, p := range prerequisites {
		graph[p[1]] = append(graph[p[1]], p[0])
	}

	// DFS 拓扑排序
	order := make([]int, 0)
	for i := 0; i < numCourses; i++ {
		if marks[i] == 0 {
			if !dfs(graph, marks, i, &order) {
				return []int{}
			}
		}
	}

	// 倒序输出拓扑排序
	for i, j := 0, len(order)-1; i < j; i, j = i+1, j-1 {
		order[i], order[j] = order[j], order[i]
	}

	return order
}

func dfs(graph [][]int, marks []int, node int, order *[]int) bool {
	marks[node] = 1
	for _, n := range graph[node] {
		if marks[n] == 1 {
			return false // 发现环
		}
		if marks[n] == 0 {
			if !dfs(graph, marks, n, order) {
				return false // 发现环
			}
		}
	}
	marks[node] = 2
	*order = append(*order, node)
	return true
}

func ArrayToString(arr []int) string {
	res := "["
	for i := 0; i < len(arr); i++ {
		res += fmt.Sprint(arr[i]) //对[]int数组可以用strconv.Itoa(arr[i])
		if i != len(arr)-1 {
			res += ","
		}
	}
	return res + "]"
}

func main() {
	numCourses := 2
	prerequisites := [][]int{{1, 0}}
	res := findOrder(numCourses, prerequisites)
	fmt.Println(ArrayToString(res))
	numCourses = 4
	prerequisites = [][]int{{1, 0}, {2, 0}, {3, 1}, {3, 2}}
	res = findOrder(numCourses, prerequisites)
	fmt.Println(ArrayToString(res))
}

输出:

[0,1]
[0,2,1,3]

代码2: BFS 拓扑排序

package main

import "fmt"

func findOrder(numCourses int, prerequisites [][]int) []int {
    // 构建邻接表和入度数组
    graph := make([][]int, numCourses)
    inDegree := make([]int, numCourses)
    for _, p := range prerequisites {
        graph[p[1]] = append(graph[p[1]], p[0])
        inDegree[p[0]]++
    }

    // 入度为 0 的结点入队列
    queue := make([]int, 0)
    for i := 0; i < numCourses; i++ {
        if inDegree[i] == 0 {
            queue = append(queue, i)
        }
    }

    order := make([]int, 0)

    // 拓扑排序
    for len(queue) > 0 {
        node := queue[0]
        queue = queue[1:]
        order = append(order, node)
        numCourses--

        for _, n := range graph[node] {
            inDegree[n]--
            if inDegree[n] == 0 {
                queue = append(queue, n)
            }
        }
    }

    if numCourses == 0 {
        return order
    } else {
        return []int{}
    }
}

func ArrayToString(arr []int) string {
	res := "["
	for i := 0; i < len(arr); i++ {
		res += fmt.Sprint(arr[i]) //对[]int数组可以用strconv.Itoa(arr[i])
		if i != len(arr)-1 {
			res += ","
		}
	}
	return res + "]"
}

func main() {
	numCourses := 2
	prerequisites := [][]int{{1, 0}}
	res := findOrder(numCourses, prerequisites)
	fmt.Println(ArrayToString(res))
	numCourses = 4
	prerequisites = [][]int{{1, 0}, {2, 0}, {3, 1}, {3, 2}}
	res = findOrder(numCourses, prerequisites)
	fmt.Println(ArrayToString(res))
}

输出:

[0,1]
[0,1,2,3]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子邮件协议(SMTP,MIME,POP3,IMAP)

SMTP 关键词&#xff1a; 电子邮件协议:SMTP简单邮件传输协议&#xff0c;负责将邮件上传到服务器&#xff0c;采用TCP的25端口&#xff0c;C/S工作。仅传送ASCII码文本 详细介绍&#xff1a; SMTP是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上…

学系统集成项目管理工程师(中项)系列23b_信息系统集成及服务管理(下)

1. 信息技术服务 1.1. 供方为需方提供如何开发、应用信息技术的服务&#xff0c;以及供方以信息技术为手段提供支持需方业务活动的服务 1.2. 信息技术咨询服务、设计与开发服务、信息系统集成服务、数据处理和运营服务及其他信息技术服务 2. 信息系统审计 2.1. 收集并评估证…

Golang中的协程(goroutine)

目录 进程 线程 并发 并行 协程(goroutine) 使用sync.WaitGroup等待协程执行完毕 多协程和多线程 进程 进程就是程序在操作系统中的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;进程是一个动态概念&#xff0c;是程序在执行过程中分配和管理…

C语言_用VS2019写第一个C语言或C++程序

接上一篇&#xff1a;C语言简述、特点、常用编译器&#xff0c;VS2010写第一个C语言程序 本次来分享用VS2019来写C语言或C程序&#xff0c;也是补充上一篇的知识&#xff0c;话不多说&#xff0c;开始上菜&#xff1a; 此博主在CSDN发布的文章目录&#xff1a;我的CSDN目录&…

微信小程序nodejs+vue+uniapp超市网上购物商城系统

超市购物系统用户端要求在系统的安卓手机上可以运行&#xff0c;主要实现了管理端&#xff1b;首页、个人中心、用户管理、商品分类管理、商品信息管理、商品入库管理、订单信息管理、订单配送管理、订单评价管理、退货申请管理、换货申请管理、系统管理&#xff0c;用户端&…

总结857

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前3讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

4-《安卓进阶》

4-《安卓进阶》 1 Okhttp2 Retrofit3 Android常用图片库对比4 Glide原理手写图片加载框架思路5 Rxjava6 Android IPC机制&#xff08;面试八股文之一&#xff09;6.1.Android中进程和线程的区别6.2.IPC概念6.3.Android序列化与反序列化6.3.Android如何开启多进程&#xff1f;多…

MDIO总线

基于linux-3.14.16 首先要搞清楚总线的位置&#xff0c;即硬件上的位置 如上图&#xff0c;mdio总线是mac和phy之间的连接方式&#xff0c;主要用于配置配置phy的寄存器&#xff0c;所以phy应该是器的一类物理设备&#xff0c;mdio总线驱动和总线设备都是围绕phy工作的。 一…

一图看懂 async_timeout 模块:异步 I/O 的超时设置,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 async_timeout 模块&#xff1a;异步 I/O 的超时设置&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9ca;模块图&#x1f9ca;类关系图…

chatgpt赋能Python-pythonfrozenset

Python frozenset介绍 在Python中&#xff0c;可以通过frozenset创建不可变集合。与set不同&#xff0c;frozenset一旦被创建就无法修改。frozenset通常用于作为字典的键&#xff0c;因为字典键必须是不可变的。 如何创建frozenset frozenset可以通过将可迭代对象作为参数传…

Blazor实战——Known框架快速开始

Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 开源地址: https://gitee.com/known/Known 1. 安装项目模板并创建新项目 打开命令行输入如下命令安装和创建。 -- 安装模板 dotnet n…

chatgpt赋能Python-pythonformat的用法小数点位数

Python中的format函数和小数点位数 介绍 Python中的format函数是一种格式化输出字符串的方法&#xff0c;允许你使用占位符来指定输出的格式。你可以使用format函数来格式化字符串&#xff0c;比如确定字符串的长度、插入变量或按特定格式输出字符串。 在本文中&#xff0c;…

Xubuntu22.04之自动调节亮度护眼redshift(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

chatgpt赋能Python-pythonfib

Pythonfib&#xff1a;一个优秀的计算斐波那契数列的Python函数 斐波那契数列是一种非常有趣也非常常见的数列&#xff0c;它起源于数学但在计算机科学中也经常被用到。Pythonfib是一个优秀的Python函数&#xff0c;可以用来计算斐波那契数列。本文将对Pythonfib进行详细介绍&…

本地电脑搭建Plex私人影音云盘教程,内网穿透实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDN远程穿透的文章&#xff1a;免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问…

【红队系列】外网信息收集(二)

红队系列 &#x1f525;系列专栏&#xff1a;红队系列 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2023年5月20日&#x1f334; &#x1f36d;作者水平很有限&#xff0c;如果发现错误&…

chatgpt赋能Python-pythondescribe

PythonDescribe&#xff1a;更快、更准确、更易用的Python文档生成工具 介绍 Python是一种在数据科学和Web开发等领域广泛应用的高级编程语言。但是&#xff0c;在编写Python代码时&#xff0c;文档的编写常常被忽视。文档的缺失会使代码难以理解、维护和重复使用。幸运的是&…

基于MAC地址的ACL配置

基于MAC地址的ACL配置 【实验目的】 掌握基于MAC地址的标准ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 S1 e0/0 N/A N/A N/A e0/1 N/A N/A N/A PC1 N/…

chatgpt赋能Python-pythonfloat设置精度

Python float设置精度 在Python中&#xff0c;float是一种表示小数的数据类型。但是在某些情况下&#xff0c;我们可能需要设置float的精度&#xff0c;以避免舍入误差造成的问题。在本文中&#xff0c;我们将介绍如何在Python中设置float的精度。 为什么需要设置float的精度…

芯片设计全流程知识点总结

1、低功耗工具 功耗分析预测分析工具包括PowerArtist&#xff08;Ansys&#xff09;、Spyglass Power&#xff08;Synopsys&#xff09;、Prime Time PX&#xff08;Synopsys&#xff09;和Redhawk&#xff08;Ansys&#xff09;等。通过对实际项目中&#xff1b;不同工具的比…