BFS和DFS

本文介绍了BFS(广度优先搜索)和DFS(深度优先搜索)的基本概念、用法以及它们在图和树中的应用。BFS通过队列实现,适合寻找最短路径,而DFS利用栈,常用于解决游戏或拼图问题。两者在时间复杂度上相同,但在实际场景中有各自的优势。
摘要由CSDN通过智能技术生成

BFS和DFS

最近开始在刷图论和数的题,其中BFS和DFS算是比较基础的一个搜索“方法”了,于是特地去网上搜了一下,重新温习了以前学数据结构中学的这几个方法。

DFS

DFS(Depth First Search) :深度优先搜索

介绍

DFS,如其名,就是优先进行深度方面的搜索,先对一条路探索到底,然后回溯之后继续对另一条路探索到底,我愿将其称作不撞南墙不回头

用法

DFS广泛的运用于图和树的搜索中,其中在树种的应用为前、中、后序遍历,这个在我的一篇文章中讲过,wy的leetcode刷题记录_Day30_二叉树起点!,其中代码实现也在里面;而对于图的应用可以用一个小例题来概括:岛屿问题:463. 岛屿的周长在这里插入图片描述
1表示陆地,0表示水域(目的是遍历完陆地的部分)。
首先我们要注意边界的问题,也就是dfs的出口:

void dfs(int[][] grid, int r, int c){
   
    // 如果坐标不合法,直接返回
    if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {
   
        return;
    }
}

另外要注意的就是上面留下的疑问了:遍历过的网格如何确定它遍历过没有,这样就不至于卡在死循环里

题目中是用数值来表示陆地和水域,那么可以改变遍历过的网格 的数值(当然,这个值别是0、1就好),以此来判断它走没走过,是不是很巧妙 :

void dfs(int[][] grid, int r, int c){
   
    if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {
   
        return;
    }
    // 如果这个方格不是岛屿,也直接返回
    if (grid[r][c] != 1) {
   
        return;
    }
    grid[r][c] = 2; // 标记遍历过的岛屿
    dfs(grid, r - 1, c); // 探索上边的方格
    dfs(grid, r + 1, c); // 下边的
    dfs(grid, r, c - 1); // 左边的
    dfs(grid, r, c + 1); // 右边的
}

代码

class Solution {
   
    constexp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wy-1226

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值