前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang Leetcode 210. Course Schedule II.go

Golang Leetcode 210. Course Schedule II.go

作者头像
anakinsun
发布2019-04-12 11:30:36
3660
发布2019-04-12 11:30:36
举报
文章被收录于专栏:学习日记学习日记

版权声明:原创勿转 https://cloud.tencent.com/developer/article/1412913

思路

这是上一个题目的延续,上一个要求判断是否可以走通,这个要求输出路径

首先解释一下,入度的意思,就是前续节点的数量,也就是说有多少个节点走向当前这个节点

设置一个队列

第一步现将所有入度为0的节点保存在队列中

然后,出队列,并将该节点的后续节点的入度减一

如果后续节点的入度变成0,入队列

最后将结果逆序

code

代码语言:javascript
复制
func findOrder(numCourses int, prerequisites [][]int) []int {
	if numCourses == 0 {
		return []int{}
	}
	m := make([][]int, numCourses)
	in := make([]int, numCourses)
	q := []int{}
	order := []int{}
	for _, p := range prerequisites {
		m[p[0]] = append(m[p[0]], p[1]) //记录所有的对应关系
		in[p[1]]++                      //记录入度
	}
	//把所有入度为0的节点,入队列
	for i := 0; i < numCourses; i++ {
		if in[i] == 0 {
			q = append(q, i)
		}
	}
	//循环处理,一边出队列,一边入队列
	for len(q) != 0 {
		cur := q[0]
		q = q[1:] //出队列
		order = append(order, cur)
		//处理该节点的后续节点
		for i := 0; i < len(m[cur]); i++ {
			dep := m[cur][i]
			in[dep]-- //后续节点-1
			if in[dep] == 0 {
				//如果入度变成了0,入队列
				q = append(q, dep)
			}
		}
	}
	//如果还有节点没有处理,则不能完成课程
	if len(order) != numCourses {
		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
}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路
  • code
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档