BFS 算法
BFS 找到的路径一定是最短的, 问题的本质就是让你在一幅「图」中找到从起点 start
到终点 target
的最近距离。
二叉树的最小深度
https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
func minDepth(root *TreeNode) int { if root == nil { return 0 } queue := make([]*TreeNode, 0) queue = append(queue, root) depth := 1
for len(queue) != 0 { sz := len(queue) for i := 0; i < sz; i++ { curr := queue[0] queue = queue[1:]
if curr.Left == nil && curr.Right == nil { return depth } if curr.Left != nil { queue = append(queue, curr.Left) } if curr.Right != nil { queue = append(queue, curr.Right) } } depth++ }
return depth }
|
打开转盘锁
https://leetcode-cn.com/problems/open-the-lock/
如何穷举一个密码的所有组合?比如说从 "0000"
开始,转一次,可以穷举出 "1000", "9000", "0100", "0900"...
共 8 种密码。然后,再以这 8 种密码作为基础,对每个密码再转一下,穷举出其他
这就可以抽象成一幅图,每个节点有 8 个相邻的节点,知道起点终点,求最短距离,典型的 BFS 问题了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| func openLock(deadends []string, target string) int { queue := make([]string, 0) visited := make(map[string]bool) for _, d := range deadends { if d == "0000" { return -1 } visited[d] = true }
queue = append(queue, "0000") visited["0000"] = true
steps := 0
for len(queue) != 0 { sz := len(queue) for i := 0; i < sz; i++ { curr := queue[0] queue = queue[1:]
if curr == target { return steps }
for j := 0; j < 4; j++ { up, down := plusOne(curr, j), minusOne(curr, j)
if _, ok := visited[up]; !ok { queue = append(queue, up) visited[up] = true } if _, ok := visited[down]; !ok { queue = append(queue, down) visited[down] = true } } } steps++ }
return -1 }
func plusOne(s string, j int) string { chars := []rune(s) if chars[j] == '9' { chars[j] = '0' } else { chars[j] += 1 } return string(chars) }
func minusOne(s string, j int) string { chars := []rune(s) if chars[j] == '0' { chars[j] = '9' } else { chars[j] -= 1 } return string(chars) }
|