前端就该用 JS 刷算法17

89 阅读2分钟

每日一题 -- 树

814. 二叉树剪枝

814. 二叉树剪枝

// https://leetcode-cn.com/problems/binary-tree-pruning/
// 814. 二叉树剪枝

/**
 * @分析
 * 1. 后续遍历求的子节点
 * 2. 如果左右节点存在,证明这棵树有存在的价值(有1),所以判定条件有3
 * 2.1 分别是左右节点是否存以及当前根节点是否为1,取并集即可
 */
var pruneTree = function (root) {
    if (!root) return null
    root.left = pruneTree(root.left)
    root.right = pruneTree(root.right)
    if (root.val || root.left || root.right) return root
    return null
}

91算法 -- 搜索

695.岛屿的最大面积

695.岛屿的最大面积

分析

  1. 这题是看题解理解之后做的
  2. 每一个 dfs 取他们四周的的值,其实这里的 dfs 更像是 dp 状态,他们的状态由申身边的 4 个 dp 构成维护
  3. 由于其他 dp 可能已经取了某个岛屿的值,所以为了保证不重复,所以走过的岛屿要设置为0,这样任意一个值都可以由它四个方式的 dp 状态了表示了

边界

  1. 边缘地方没有4个方向,所以需要给他们设置一层虚拟的海域 -- 超出部分都是 0
  2. 如果是海域位置,不需要我们需要考虑的,直接跳过即可
// https://leetcode-cn.com/problems/max-area-of-island/
// 695.岛屿的最大面积

/**
 * 使用深度优先遍历+四方取值来解决这个题
 * @分析
 * 1. 走过一次的岛屿要标记为已经走过了,即0,防止重复走
 * 
 */
var maxAreaOfIsland = function (grid) {
    let max =0
    const row = grid.length
    const column = grid[0].length
    const dfs = (i, j) => {
        // 遍历到海洋,或者超出范围的,都当海洋处理
        if (i >= row || i < 0 || j >= column || j < 0) {
            return 0
        }
        if (!grid[i][j]) return 0
        // 只要遍历过了,就直接设置为0,不要重复走
        grid[i][j] = 0
        // 正常的值
        return 1 + dfs(i - 1, j) + dfs(i + 1, j) + dfs(i, j - 1) + dfs(i, j + 1)
    }

    for (let i = 0; i < row; i++) {
        for (let j = 0; j < column; j++) {
            max =  Math.max(dfs(i, j),max)
        }
    }
    return max
};