基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)(LeedCode200)
程序员文章站
2022-05-23 21:48:00
...
——个人学习笔记
参考:https://www.jianshu.com/p/bff70b786bb6
- 简单归纳:深度就是一直向下查找,只要能向下查找就先向下;广度就是先把本层查找完再向下,和本层相同层次的也要查找完才向下查找。
- 题目:https://leetcode-cn.com/problems/number-of-islands/
其实思路很简单,但是要区分深度和广度还是有一点难度。
思路参考:https://leetcode-cn.com/problems/two-sum/solution/dao-yu-shu-liang-by-leetcode/ - 深度优先搜索(DFS)。遍历数组,找到“1”,则该位置改为0,然后进入dfs函数开始查找,如果上下左右有一个是1的,再该其位置为0,进入dfs函数查找,一直进行······到上下左右都为0,就返回上一个继续进行查找,直到第一个1的上下左右都为0就结束,这就是深度优先搜索。
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int nr = grid.size();
if (!nr) return 0;
int nc = grid[0].size();
int num_islands = 0;
for (int r = 0; r < nr; ++r) {
for (int c = 0; c < nc; ++c) {
if (grid[r][c] == '1') {
++num_islands;
dfs(grid, r, c);
}
}
}
return num_islands;
}
private:
void dfs(vector<vector<char>>& grid, int r, int c) {
int nr = grid.size();
int nc = grid[0].size();
grid[r][c] = '0';
if (r - 1 >= 0 && grid[r-1][c] == '1') dfs(grid, r - 1, c);
if (r + 1 < nr && grid[r+1][c] == '1') dfs(grid, r + 1, c);
if (c - 1 >= 0 && grid[r][c-1] == '1') dfs(grid, r, c - 1);
if (c + 1 < nc && grid[r][c+1] == '1') dfs(grid, r, c + 1);
}
};
- 广度优先搜索(BFS)。同样遍历数组,找到“1”,则把位置记录(放入pair),然后进行广度搜索,把记录的位置拿出来,找其上下左右,有“1”的则也把位置记录(放入pair)。一直到pair为空为止。(pair通常用来记录地图的位置下标)
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int nr = grid.size();
if (!nr) return 0;
int nc = grid[0].size();
int num_islands = 0;
for (int r = 0; r < nr; ++r) {
for (int c = 0; c < nc; ++c) {
if (grid[r][c] == '1') {
++num_islands;
grid[r][c] = '0';
queue<pair<int, int>> n;
n.push({r, c});
while (!n.empty()) {
auto rc = n.front();
n.pop();
int row = rc.first, col = rc.second;
if (row - 1 >= 0 && grid[row-1][col] == '1') {
n.push({row-1, col}); grid[row-1][col] = '0';
}
if (row + 1 < nr && grid[row+1][col] == '1') {
n.push({row+1, col}); grid[row+1][col] = '0';
}
if (col - 1 >= 0 && grid[row][col-1] == '1') {
n.push({row, col-1}); grid[row][col-1] = '0';
}
if (col + 1 < nc && grid[row][col+1] == '1') {
n.push({row, col+1}); grid[row][col+1] = '0';
}
}
}
}
}
return num_islands;
}
};
- Tip:这两种区别就在是把1的上下左右都查找完才进行下一个查找,还是上下左右一查找到1就进行下一个查找。前者为广度,后者为深度。
推荐阅读
-
python深度优先搜索和广度优先搜索
-
DFS(一):深度优先搜索的基本思想
-
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
-
可能是目前为止最为详细的深度优先搜索DFS和广度优先搜索BFS算法分析
-
数据结构与算法-----BFS与DFS(广度优先搜索与深度优先搜索)
-
数据结构与算法_深度优先搜索(DFS)与广度优先搜索(BFS)详解
-
Java数据结构与算法:图、图的概念、深度优先搜索DFS、广度优先搜索BFS、思路分析、代码实现
-
【数据结构】图的遍历——深度优先搜索DFS、广度优先搜索BFS
-
Java数据结构与算法——深度优先搜索与广度优先搜索
-
数据结构与算法——广度和深度优先搜索