

算法系列:优先遍历
source link: https://muyuuuu.github.io/2022/05/30/dfs-bfs/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

主要收录深度优先遍历和宽度优先遍历,深度优先遍历一般可以与回溯、递归、树等方法联用,达到优雅遍历的效果,而宽度优先搜索可以用到最短路问题的求解中。
- 为什么不用 bfs 去遍历?第一是因为 bfs 写起来麻烦,不如 dfs 直观。第二是在某些查找到满足情况即可退出的应用而言,bfs 需要一层一层的去检查,效率很低。
- 为什么不用 dfs 去求最短路?如上所示,bfs 可以一层一层的检查,相对 dfs 更容易查到最短路。
130. 被围绕的区域
给你一个 m x n
的矩阵 board
,由若干字符 'X'
和 'O'
,找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
- 那么如何填充内部的
O
呢?这里就要用到dfs
,首先遍历board
,如果遇到了O
,那个和这个O
相邻的O
也要被填充,此时就要使用dfs
来查找相邻的O
- 由于只填充被
X
包围的O
,因此,边界上的O
不能被填充。那么我们预先把和边界相连的O
都填充为其他符号,在处理完board
内部的O
的时候,在把其他符号替换为O
即可。
class Solution {
public:
int n, m;
void solve(vector<vector<char>>& board) {
n = board.size();
m = board[0].size();
// 替换边界
for (int i = 0; i < n; i++) {
dfs(i, 0, board, '+');
dfs(i, m-1, board, '+');
}
for (int i = 0; i < m; i++) {
dfs(0, i, board, '+');
dfs(n-1, i, board, '+');
}
// 填充内部的 O
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (board[i][j] == 'O') {
dfs(i, j, board, 'X');
}
}
}
// 替换回来
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (board[i][j] == '+') {
board[i][j] = 'O';
}
}
}
}
// dfs 查找相连的 O
void dfs(int r, int c, vector<vector<char>>& board, char pad) {
if (r < 0 || c < 0 || r >= n || c >= m) {
return;
}
if (board[r][c] == 'O') {
board[r][c] = pad;
dfs(r + 1, c, board, pad);
dfs(r - 1, c, board, pad);
dfs(r, c + 1, board, pad);
dfs(r, c - 1, board, pad);
}
}
};
Recommend
-
48
最近在练习用Python刷算法,leetcode上刷了快300题。一开始怀疑自己根本不会写代码,现在觉得会写一点点了,痛苦又充实的刷题历程。对我这种半路出家的人而言,收获真的很大。 今天就从二叉树遍历写起,曾经有次面试就被迭代实现...
-
10
二叉树遍历算法总结 | MaskRay#include <algorithm>#include <cstdio>#include <queue>#include <stack>using namespace std;struct Node { int key...
-
24
图遍历搜索算法是一种非常迷人的算法,它是一种将抽象枯燥的逻辑与较为直观的“图”相结合的算法。本文将讨论图遍历搜索算法背后的逻辑,并且通过简单的实例来理解广度优先搜索算法的工作原理。图遍历搜索算法简介按照最浅显的...
-
6
V2EX › PHP 大佬们, PHP 除了遍历以外,怎么用算法比较快的输出符合一个已经排序好的符合一个范围内的数组
-
5
【阅读时间】7 - 10 min | 4300字【阅读内容】结合应用场景,总结有关二叉树遍历的所有算法和对应Leetcode题目编号。基于Python代码,给出完整逻辑链。希望给读者一个线头,让你永远忘不了这几个遍历算法...
-
1
通过叶子统计树上结点数 对于一颗有根树,如果所有非叶子结点都至少有两个孩子(等价的不存在度数为22的结点),那么我们就可以用叶子数来约束整个树的大小,这样的树我们称其为...
-
8
本文记录作者刷题过程中与深度优先遍历相关的题目。 一、岛屿问题 岛屿系列算法问题是经典的面试高频题,岛屿系列题目的核心考点就是用 DFS/BFS 算法遍历二维数组。如何在二维矩阵中使用 DFS 搜索呢? 我们可以把...
-
3
#yyds干货盘点# leetcode算法题:N 叉树的前序遍历 原创 灰太狼_cxh 2022...
-
8
数据结构与算法:图的遍历—深度优先搜索 作者:日拱一卒程序猿 2023-04-14 08:07:20 邻接表 访问所有顶点的时间为 O(V),而查找所有顶点的邻居一共需要 O(E) 的时间,所以总的时间复杂度是 O(V + E)。
-
7
从树的广度优先遍历,到图的广度优先遍历 biancheng1 · 大约13小时之前...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK