欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基本算法——深度优先搜索(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就进行下一个查找。前者为广度,后者为深度。