简单搜索之DFS 理解与思路

DFS 简单理解

核心算法:DFS

DFS 理解起来可以从全排列 或者 树的遍历 开始

就是会根据已有遍历规则来 从一条路走到底 直到路不通 ,返回到之前的有路的地方 再重复此过程,直到访问完所有地方(元素)(简称不撞南墙不回头)

如何代码实现DFS?

通常使用递归方法

基本DFS框架及其说明(以二维数组图的搜索为例)
void dfs (int[][] board ,int x,int y){
if(终止条件){
return;
}

//修改标记状态,这里可以是引入visited数组,也可能是修改数组元素)如:
visited[x][y] = true;

dfs(step1) //step1 可能对应 以该点向下搜索
dfs(step2)//step2 可能对应 以该点向上搜索
dfs(step3)//step3 可能对应 以该点向左搜索
dfs(step4)//step4 可能对应 以该点向右搜索
	
	//设想如果没有上面的标记状态,dfs可能永远不会停止,因为会在已经搜索的点来回搜索

//回溯标记状态,这里根据题意来决定是否需要,如果另一个出发点搜索会被之前出发点搜索影响就必须回溯。
//这里可以看leetcode79题,不回溯就有bug,回溯说白了就是如果一条路走不通了,把上一个可以走通的点标为未访问从而不影响一次从其他起始搜索点开始搜索导致异常。

visited[x][y] = false; 

}

如何确定DFS的具体实现

以上只是框架,但具体应用到具体题目,我们需要抓住的核心点 有

  1. DFS的返回值。常见会返回void 、boolean、int等。
  2. DFS的形参。
  3. DFS的终止条件。
  4. DFS递归的时候step怎么写。
  5. 主程序确定搜索起始点以及如何根据题目意思调用自己写的DFS。
理解DFS小总结
  1. 理解DFS的过程,不撞南墙不回头,才能发现这种算法更适用于如找是否存在结果的题目。
  2. 递归的过程不要一直想着 进入到 递归里面 ,因为递归永远是在重复的过程 ,确定了终止条件它必然会停止,一直想递归过程容易被绕,但是刚开始不清楚可以用idea调试看看递归过程就清楚了。
  3. 递归是怎么实现 DFS 回到 之前有路的地方 呢?随着一层递归的结束意味着 没有路 可走了,那么它就会回到上一个递归的地方 ,上一个递归的地方 不就是 我之前站在十字路口 做选择的地方吗?假设我之前选了向南走,那么这次我就可以选择向北走啦。
  4. 结合BFS理解。
DFS 刷题参考

leetcode79 单词搜索
leetcode695 岛屿最大面积
leetcode130 被围绕的区域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值