(2)算法 队列和栈

118 阅读1分钟

探索部分 队列&栈

广度优先搜索

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 完全平方数