Golang Leetcode 207. Course Schedule.go

版权声明:原创勿转 https://blog.csdn.net/anakinsun/article/details/89013244

思路

DAG,顾名思义,如果一个有向图中从任意点出发都不能回到该点的话,这张图就是一个有向无环图
判断一个有向图是否有环,有两个算法:

拓扑排序
即找出该图的一个线性序列,使得需要事先完成的事件总排在之后才能完成的事件之前。如果能找到这样一个线性序列,则该图是一个有向无环图
DFS
遍历图中的所有点,从i点出发开始DFS,如果在DFS的不断深入过程中又回到了该点,则说明图中存在回路。

第一次知道这种数据结构和解决思路

code

func canFinish(numCourses int, prerequisites [][]int) bool {
	m := make(map[int][]int)
	res := make([]int, numCourses)
	for _, p := range prerequisites {
		v, ok := m[p[0]]
		if !ok {
			m[p[0]] = []int{p[1]}
		} else {
			m[p[0]] = append(v, p[1])
		}
	}
	for i := 0; i < numCourses; i++ {
		if helper(i, res, m) == false {
			return false
		}
	}
	return true
}
func helper(idx int, res []int, m map[int][]int) bool {
	if res[idx] == 1 {
		return true
	}
	if res[idx] == 2 {
		return false
	}
	v, ok := m[idx]
	if !ok {
		return true
	}
	res[idx] = 2
	for i := 0; i < len(v); i++ {
		if helper(v[i], res, m) == false {
			return false
		}
	}
	res[idx] = 1
	return true
}

更多内容请移步我的repo: https://github.com/anakin/golang-leetcode

猜你喜欢

转载自blog.csdn.net/anakinsun/article/details/89013244