探索部分 队列&栈
广度优先搜索
1 岛屿数量:给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。
var numIslands = function (grid) {
let count = 0;
if (grid.length === 0) return count
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[0].length; j++) {
if (grid[i][j] === '1') {
bfsSearch(grid, i, j);
//dfsSearch(grid, i, j)
count++
}
}
}
return count
};
var dfsSearch = function (grid, i, j) {
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) return
if (grid[i][j] === '1') {
grid[i][j] = '0';
dfsSearch(grid, i + 1, j)
dfsSearch(grid, i - 1, j)
dfsSearch(grid, i, j + 1)
dfsSearch(grid, i, j - 1)
}
}
var bfsSearch = function (grid, i, j) {
var arr = [];
//var direcArr = [[-1, 0], [1, 0], [0, -1], [0, 1]] //方向数组
arr.push([i, j]);
while (arr.length != 0) {
let id = arr.shift();
let r = id[0]
let c = id[1]
// for (let i = 0; i < direcArr.length; i++) { //简化相似的代码
// if (((r + direcArr[i][0] >= 0 || r + direcArr[i][0] < grid.length) && grid[r + direcArr[i][0][c]] === '1') || ((c + direcArr[i][1] >= 0 || c + direcArr[i][1] < grid[0].length) && grid[r][c + direcArr[i][1]] === '1')) {
// arr.push([r + direcArr[i][0], c + direcArr[i][1]])
// grid[r + (direcArr[i][0])][c + (direcArr[i][1])] = '0';
// }
// }
if (r - 1 >= 0 && grid[r - 1][c] === '1') {
arr.push([r - 1, c])
grid[r - 1][c] = '0';
}
if (r + 1 < grid.length && grid[r + 1][c] === '1') {
arr.push([r + 1, c])
grid[r + 1][c] = '0';
}
if (c - 1 >= 0 && grid[r][c - 1] === '1') {
arr.push([r, c - 1])
grid[r][c - 1] = '0';
}
if (c + 1 < grid[0].length && grid[r][c + 1] === '1') {
arr.push([r, c + 1])
grid[r][c + 1] = '0';
}
}
}
var grid = [
['1', '1', '1', '1', '0'],
['1', '1', '0', '1', '0'],
['1', '1', '0', '0', '0'],
['0', '0', '0', '0', '0']
]
console.log(numIslands(grid)) //1
2 打开转盘锁 3 完全平方数