0
点赞
收藏
分享

微信扫一扫

【算法】广度优先搜索和深度优先搜索

婉殇成长笔记 2022-04-18 阅读 79
dfsbfs算法

一、广度优先搜索 (BFS)

1.学习视频 BFS学习视频简单易懂b站麦克老师讲算法
2.原理
在这里插入图片描述
在这里插入图片描述

二、深度优先搜索 (DFS)

1、学习视频麦克老师讲算法DFS
2、原理
在这里插入图片描述

三、例题leetcode200岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1
示例 2:

输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] 的值为 ‘0’ 或 ‘1’

解法一:深度优先算法

var numIslands = function(grid) {
  //px/py代表四个方向
  var px = [-1, 1, 0, 0];
  var py = [0, 0, -1, 1];
  var dfs = function (sr, sc) {
     if ((sr > -1 && sc > -1) && (sr < grid.length && sc < grid[0].length)) {
         //grid[sr][sc]某座岛屿的第一块陆地,将它沉没
         grid[sr][sc] = '0';
         //向这块陆地的四个方向试探
         //如果它四周有满足条件的陆地,则向满足条件的陆地的四周继续试探
         for (var k = 0; k < 4; k++) {
            var newx = sr + px[k];
            var newy = sc + py[k];
            if ((newx > -1 && newy > -1) && (newx < grid.length && newy < grid[0].length)) {
            //某个方向是陆地,则继续搜索
                if (grid[newx][newy] === '1') {
                    dfs(newx, newy);
                } else {
                //某个方向不是陆地,那么向其他方向试探
                    continue;
                }
             }
          }
          //当这座岛的陆地全部沉没,岛屿数量加一
          return 1;
      }
  };
  var count = 0;
  for (var i = 0; i < grid.length; i++) {
     for (var j = 0; j < grid[0].length; j++) {
         if (grid[i][j] === '1') {
            count += dfs(i, j);
         } else {
            continue;
         }
     }
  }
  return count;
};

解法二:广度优先算法

var numIslands = function(grid) {
  var queue = [];
  //px/py代表四个方向
  var px = [-1, 1, 0, 0];
  var py = [0, 0, -1, 1];
  var bfs = function (sr, sc) {
    if ((sr > -1 && sc > -1) && (sr < grid.length && grid[0].length) && grid[sr][sc] === '1') {
        //将某座岛屿的第一块陆地放到队首,并将这块陆地沉没
        var start = new Object();
        start.x = sr;
        start.y = sc;
        start.land = grid[start.x][start.y];
        queue.push(start);
        grid[sr][sc] = '0';
        //当队列不为空时,遍历该队列
        while (queue.length !== 0) {
        //取队首元素,向它的四个方向的相邻的陆地查看,如果满足条件,入队
        //四个方向查看完毕后将队首元素出队
        //对新的队首元素重复以上过程,直到队列为空
           var startX = queue[0].x;
           var startY = queue[0].y;
           for (var k = 0; k < 4; k++) {
              var newx = startX + px[k];
              var newy = startY + py[k];
              if ((newx > -1 && newy > -1) && (newx < grid.length && grid[0].length) && grid[newx][newy] === '1') {
                 var newPoint = new Object();
                 newPoint.x = newx;
                 newPoint.y = newy;
                 newPoint.land = grid[newx][newy];
                 queue.push(newPoint);
                 grid[newx][newy] = '0';
              } else {
                 continue;
              }
          }
          queue.shift();
      }
      return 1;
    }
  }
  var count = 0;
  for (var i = 0; i < grid.length; i++) {
    for (var j = 0; j < grid[0].length; j++) {
       if (grid[i][j] === '1') {
          count += bfs(i, j);
       } else {
          continue;
       }
    }
 }
 return count;
}
举报

相关推荐

0 条评论