算法入门之广度优先搜索(BFS)和深度优先搜索(DFS)

RE4wwu6.jpg

733. 图像渲染

从起始像素向上下左右扩散,只要相邻的点存在并和起始点颜色相同,就染成新的颜色,并继续扩散。

借助一个队列去遍历节点,考察出列的节点,带出满足条件的节点入列。已经染成新色的节点不会入列,避免重复访问节点。

时间复杂度:O(n)O(n)。空间复杂度:O(n)O(n)

const floodFill = (image, sr, sc, newColor) => {
  const row = image.length;
  const column = image[0].length;
  const oldColor = image[sr][sc];

  if (oldColor == newColor) return image;

  const queue = [];

  queue.push([sr, sc])

  while (queue.length) {
    const [i, j] = queue.shift();
    image[i][j] = newColor;

    if (i - 1 >= 0 && image[i - 1][j] == oldColor) queue.push([i - 1, j]);
    if (i + 1 < row && image[i + 1][j] == oldColor) queue.push([i + 1, j]);
    if (j - 1 >= 0 && image[i][j - 1] == oldColor) queue.push([i, j - 1]);
    if (j + 1 < column && image[i][j + 1] == oldColor) queue.push([i, j + 1]);
  }

  return image;
};

695. 岛屿的最大面积

const maxAreaOfIsland = grid => {
  let res = 0;
  // 遍历地图每一个点,找其最大的岛屿
  for (let i = 0; i < grid.length; i++) {
    for (let j = 0; j < grid[0].length; j++) {
      res = Math.max(res, dfs(grid, i, j));
    }
  }
  return res;
};

const dfs = (grid, i, j) => {
  // 以下情况不是岛屿,返回0
  if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] !== 1) return 0;

  // 遍历过的点,设置为0
  // 因为后面还会再次遍历到
  grid[i][j] = 0;
  // 该点面积为1
  let area = 1;

  // 从上下左右四方向继续找
  area += dfs(grid, i + 1, j) + dfs(grid, i - 1, j) + dfs(grid, i, j + 1) + dfs(grid, i, j - 1);

  return area;
};

617. 合并二叉树

var mergeTrees = function(t1, t2) {
    if (t1 === null) {
        return t2
    } else if (t2 === null) {
        return t1
    } else {
        t1.val = t1.val + t2.val
        t1.left = mergeTrees(t1.left, t2.left)
        t1.right = mergeTrees(t1.right, t2.right)
        return t1
    }
};

116. 填充每个节点的下一个右侧节点指针

var connect = function (root) {
    // 边界
    if (root == null) {
        return null;
    }
    const dfs = (root) => {
        // base case
        if (root.left == null && root.right == null) {
            return;
        }
        // 构建右指针
        root.left.next = root.right;
        if (root.next) {
            root.right.next = root.next.left;
        }
        dfs(root.left);
        dfs(root.right);
    }
    dfs(root);
    return root;
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容