LeetCode 搜索 4.4 DFS

92 阅读2分钟

DFS的过程中,最重要的一个特点就是一个位置只要有路,就一直走到最深处,直到无路可退,再退回一步,看在上一步的位置能不能换个方向继续向下走。这样就遍历了所有可能能到的位置。

因为DFS的独特特性,它比BFS更快的把某个区域走完。在BFS还在慢慢走,走一步撤回一步的时候,DFS能更快的把一个区域走完。这就是它为什么用来做某些题的原因。

Leetcode Graph(一) 岛屿问题

这是我之前写的文章,欢迎看并且留言。

例题 ZipRecruiter CodeSignal 原题

da93f68dc3074000346f254431721d4.jpg

8abc4ee1f7902ccc7f853b3929ec377.jpg

86a863c180e1a96c1372b9428980789.jpg

答案:

d16b78ec0ecde8fa190378e680be94c.png

这道题的变形在于只能走diagnal,那么arr1[4], arr2[4]就应该相应更改为符合相应坐标变化的点。

4.4.2 回溯和剪枝

前面提到的DFS搜索,基本的操作是将所有的节点全部拓展出来,再选取最新的一个节点进行拓展。

不过在很多情况下,用递归列举出所有的路径可能因为数量太大而超时。由于很多子节点是不符合条件的,可以在递归的时候“看到不对头就撤退”,中途停止拓展并返回。这个思路就是回溯,在回溯中用于减少子节点拓展的函数就是剪枝函数。

大部分DFS搜索题目都需要用到回溯的思路,其难度主要在于拓展子节点的时候如何构造停止递归并返回的条件。这需要通过大量的练习相关题目才能熟练应用。

八皇后问题是经典的回溯和剪枝问题。

八皇后问题:在棋盘上放置8个皇后,使得它们不同行,不同列,不同对角线。N皇后是八皇后问题的拓展。

4.4.2 回溯和剪枝

n Queens n 皇后问题