日常刷题0x9之未出新手村

125 阅读2分钟

如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的

题号:437
 //前缀和
var pathSum = function (root, sum) {
    //记录路径上的前缀和
    //初始pathSum为0的情况,当路径和刚好为sum的情况
    let map = new Map([[0,1]])
    let pathSum = 0,result = 0
    let pathSumSearch = (node) => { 
        if (node == null) {
            return
        }
        pathSum += node.val

        if (map.has(pathSum-sum)) {
            result += map.get(pathSum-sum)
        }

        if (map.has(pathSum)) {
            let count = map.get(pathSum)
            count++
            map.set(pathSum,count)
        } else { 
            map.set(pathSum,1)
        }
 
        pathSumSearch(node.left)
        pathSumSearch(node.right)
        //回滚状态
        let count = map.get(pathSum)
        count--
        if (count == 0) {
            map.delete(pathSum)
        } else { 
            map.set(pathSum,count)
        }
        pathSum -= node.val
    }
    pathSumSearch(root)
    return result
};
题号:200
//岛屿问题
var numIslands = function (grid) {

    //验证是否数组越界
    let isValid = (i, j) => { 
        //边界不符合
        if (i < 0 || i >= grid.length) {
            return false
        }
        if (j < 0 || j>= grid[0].length) {
            return false
        }
        //判断已经访问过的
        return grid[i][j] == 1
    }
    //深度优先搜索
    let dfs = (i, j) => { 
        if (isValid(i, j)) {
            //标记访问过
            grid[i][j] = -1

            dfs(i-1, j)
            dfs(i,j+1)
            dfs(i + 1, j)
            dfs(i,j-1)
        }
    }

    let result = 0
    for (let i = 0; i < grid.length; i++) {
        for (let j = 0; j < grid[0].length; j++) {
            if (grid[i][j] == 1) {
                //开始搜索
                result++
                dfs(i,j)
            }
        }
    }
    return result
};
题号:463
//岛屿问题
var islandPerimeter = function (grid) {
    let isValid = (i,j) => { 
        if (i<0 || i>=grid.length) {
            return false
        }
        if (j<0 || j>=grid[0].length) {
            return false
        }
        return true
    }
    let result = 0
    let dfs = (i, j) => { 
        if (isValid(i,j) && grid[i][j] == 1) {
            //处理当前节点
            grid[i][j] = -1
            if (!isValid(i-1,j)) {
                //上是边界
                result++
            }else if (grid[i-1][j] == 0) {
                //上边界是水
                result++
            }
            if (!isValid(i,j+1)) {
                //右是边界
                result++
            }else if (grid[i][j+1] == 0) {
                //右边是水
                result++
            }
            if (!isValid(i+1,j)) {
                //下是边界
                result++
            }else if (grid[i+1][j] == 0) {
                //下边是水
                result++
            }
            if (!isValid(i,j-1)) {
                //左是边界
                result++
            }else if (grid[i][j-1] == 0) {
                //左边是水
                result++
            }
            dfs(i-1, j)
            dfs(i,j+1)
            dfs(i + 1, j)
            dfs(i,j-1)
        }
    }
    for (let i = 0; i < grid.length; i++) {
        for (let j = 0; j < grid[0].length; j++) {
            if (grid[i][j] == 1) {
                dfs(i,j)
            }
        }
    }
    return result
};