leetcode 1466 重新规划路线 题解

发布时间 2023-07-07 13:30:18作者: will670

解题思路

执行用时:140 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:16.8 MB, 在所有 Go 提交中击败了82.00%的用户

将连接图转化成有向图,用二维slice存放。
此处将连接的起点设置为from也就是graph的外层下标,将连接的目标设为target也就是graph的内层元素。
graph会将每一个连接存放两次,使得从任一起点都可以遍历完毕该,target会保存正负以代表该连接方向。

另外新建visited判断是否遍历过节点,从0开始遍历,遍历中遇到连接方向错误的进行计数。

代码

func minReorder(n int, connections [][]int) int {
	graph := make([][]int, n)
	for _, conn := range connections {
		i, j := conn[0], conn[1]
		graph[i] = append(graph[i], j)
		graph[j] = append(graph[j], -i)
	}

	visited := make([]bool, n)
	count := 0
	var dfs func(from int)
	dfs = func(from int) {
		visited[from] = true
		for _, target := range graph[from] {
			if target < 0 && !visited[-target] {
				dfs(-target)
			} else if target > 0 && !visited[target] {
				dfs(target)
				count++
			}
		}
	}
	dfs(0)

	return count
}