基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)(LeedCode200)

——个人学习笔记
参考: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就进行下一个查找。前者为广度,后者为深度。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值