前端就该用 JS 刷算法18

156 阅读2分钟

每日一题 -- 树

1325.删除给定值的叶子节点

1325.删除给定值的叶子节点

分析

  1. 首先这道题是要删除多个叶子节点,只要删除某个叶子节点,它原先的父节点也有可能符合要求而被删除
  2. 所以,这道题还是搜索然后删除的问题,需要用到自底向上的查询,因此要用后序遍历
  3. 由于这里搜查到叶子节点并符合要求后,需要删除当前节点,为了不用考虑是父节点的左右节点问题, dfs 的时候直接返回两种情况的值即可
  4. 如果符合删除要求,就返回 null,否则返回自身
  5. 这样自底向上,不断删除符合要求的及节点,直到遍历结束,返回根节点即可。
// https://leetcode-cn.com/problems/delete-leaves-with-a-given-value/
// 1325.删除给定值的叶子节点

var removeLeafNodes = function(root, target) {
    const dfs=(root) => {
        if(!root) return null
        root.left = dfs(root.left)
        root.right = dfs(root.right)
        if(!root.left&&!root.right && root.val === target){
          //   是叶子节点,且符合要求
              return null
        }
        return root
    }  
    return dfs(root)
  };

91算法 -- 搜索

地图分析

1162. 地图分析

分析

  1. 求的是海洋距离陆地最近距离最大的那一批海洋,所以从陆地出发,不断逼近那一批可能不和陆地接壤的海洋
  2. 每一次都将陆地的上下左右都改造成陆地,防止重复操作,改造的次数就是需要求得的值
  3. 注意第一批 BFS 遍历的是原始的陆地队列,所以 steps 全局变量从 -1开始,第一次遍历的时候自增成 0
  4. 需要注意的是,只有在地图中的海洋改造地才能进入后续的队列中,且全是陆地和全是海洋的情况要判断

// https://leetcode-cn.com/problems/as-far-from-land-as-possible/
// 1162. 地图分析

/**
 * 看题解做的
 * @分析
 * 1. 找出距离海洋最近的陆地的最大的那个值
 * 2. BFS法即围海造田法,以陆地为基点,上下左右找出是否存在临近的海洋,存在则设置为新的陆地,每次完成后,记录造了多少次
 * 3. 所有陆地节点结束后,判断新造的陆地是否存在,存在则重复 2 步骤,不存在即地图中只剩下陆地了
 * 4. 那么造了多少次就是我们想要的结果,即最后被变成陆地的海洋,就是海洋距离陆地最近距离的最大值的那一批海洋,距离就是 steps
 */
var maxDistance = function(grid) {
    const n = grid.length
    const queue = [] // 每一批陆地存储的队列
    // 第一批陆地
    for(let i=0;i<n;i++){
        for(let j=0;j<n;j++){
            if(grid[i][j] === 1){
                queue.push([i,j])
            }
        }
    }
    // 如果全是陆地或者全是海洋,则返回 -1
    if(queue.length === 0 || queue.length === n**2) return -1

    let steps = -1 // 造陆地次数
    // 只要还有陆地,则继续找下去
    while(queue.length){

        let len = queue.length
        while(len--){
            const [x,y] = queue.shift()
            const arr = [[x-1,y],[x+1,y],[x,y-1],[x,y+1]] // 设置上下左右的坐标
            arr.forEach(item => {
                const [i,j] = item
                if(i>=0 && i<n&&j>=0&&j<n&&grid[i][j] ===0){
                    // 在地图中的海洋
                    queue.push([i,j])
                    // 标记为已读
                    grid[i][j] = -1
                }
            })
        }
        steps+=1 // 每一次造陆地的时候,都自增1,首次进行的时候,其实是自身
    }
    // 当只剩下陆地,bfs 结束
    return steps
   
};