【路飞】图算法

197 阅读1分钟

介绍

图是网络结构的抽象模型,是一组由边连接的节点;可以看作是多叉树的延伸。

image.png

图的表示法

邻接表邻接矩阵关联矩阵......

用邻接表、邻接矩阵来表示上面那个图:

image.png

邻接表:占用空间少;
邻接矩阵:占用比较多的空间,但能直观的看出两个点是否关联;

图的遍历

深度优先遍历
通过一个变量来记载节点是否被遍历过

const graph = {
  0: [4,3,1],
  1: [3,2,4],
  2: [3],
  3: [4],
  4: []
};
const visited = {};
fucnction dfs(n){
  if (n in visited) {
    return;
  }
  visited[n] = true;
  console.log(n);
  for (let next of graph[n]) {
    dfs(next);
  }
};
dfs(2);  // 输出 2 3 4

广度优先遍历

const graph = {
  0: [4,3,1],
  1: [3,2,4],
  2: [3],
  3: [4],
  4: []
};
function bfs(n){
  const queue = [n];
  while (queue.length) {
    const node = queue.shift();
    if (node in visited) {
      continue;
    }
    visited[node] = true;
    console.log(node);
    for (let next of graph[node]) {
      queue.push(next);
    }
  }
};
bfs(2);  // 输出 2 3 4

力扣刷题

题目:200. 岛屿数量

image.png

分析

每次遇到陆地1,就通过深度遍历把相邻的1变为0,

function numIslands(grid) {
  if (!grid || !grid.length) return 0;
  let count = 0;
  for (let i = 0; i < grid.length; i++) {
    for (let j = 0; j < grid[0].length; j++) {
      if (grid[i][j] === "1") {
        count++;
        dfs(grid, i, j);
      }
    }
  }

  return count;
    
  // 从 (i, j) 开始,将与之相邻的陆地都变成海水
  function dfs(grid, i, j) {
    if (
      i < 0 ||
      i >= grid.length ||
      j < 0 ||
      j >= grid[0].length
    ) {
      return;
    }
    if (grid[i][j] == '0') { 
      // 周围已经是海水了 
      return;
    }
    grid[i][j] = "0";
    // 淹没上下左右的陆地
    dfs(grid, i + 1, j);
    dfs(grid, i - 1, j);
    dfs(grid, i, j + 1);
    dfs(grid, i, j - 1);
  }
}