leetcode BFS解题思路

  1. Word Ladder
    思路一:单向bfs, 使用visited数组记录哪些已经访问过了, 访问过的就不允许再次入队, 同时这里想到的是使用26个英文字母,枚举可能的取值, 类似brute force
    思路二:双向bfs,使用两个set,这里没有使用queue,是因为需要在queue里查询,不方便.
    另外,需要注意的一点是,每次遍历时,都是取size较小的来做搜索,初始时,各插入头和尾,之后每次取最小的set来拓展, 这样就实现了交替访问两个set,
    是两者的高度在 l/2, 这样可以缩短一半的时间

  2. 单词接龙 II
    思路一:因为要存储最终的结果,所以图是一定要建立的,通常我们可以通过维护每个节点的子节点,即一个map,每个map里是一个数组
    我们可以称之为children数组或者parent数组
    2)每遍历一层节点后,从wordlist中删除掉这些节点,因为本题是有源节点的,从源节点看,前一层的节点不应该再次被遍历,因为长度变长了
    3)对于重复的问题,可以使用hastset来解
    4)最后通过dfs,遍历输出结果

思路二:双向bfs + dfs
解法跟思路一类似,只是需要创建两个set,然后需要不断交换两个set

  1. Race Car
    思路一:bfs解法有一个重要的技巧,即利用一个set,记录已经出现过的路径,这样bfs枚举到重复路径时,可以直接跳过,这是一个有效的prunning method.

  2. Open the Lock
    找最小步骤, 通常反应是使用BFS或者动态规划
    思路一: BFS
    BFS通过存储上一层的状态, 来推出下一层状态, 如此循环, 直到找到期望的值. 如果采用两个set去加速BFS, 需要注意全局的visited数组需要在入队之后再赋值, 因为如果在入队(入set)之前进行判断,
    那么begin set和end set中就不可能出现相同的元素了, 这样永远得不到结果. 只有允许先入队元素, 再出队时,先判断是否找到解之后, 才可以根据是否visit过来过滤

posted @ 2018-04-02 00:32  JinleiZhang  阅读(563)  评论(0编辑  收藏  举报