一、广度优先搜索 (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;
}