【前端算法系列】图

417. 太平洋大西洋水流问题

思路:深度优先遍历,逆流而上(比它大或者同等)的就是可以流到太平洋或者大西洋的坐标

var pacificAtlantic = function(matrix) {
    if(!matrix||!matrix[0]) return []
    const m = matrix.length // 行
    const n = matrix[0].length // 列
    const flow1 = Array.from({length:m},()=>new Array(n).fill(false))
    const flow2 = Array.from({length:m},()=>new Array(n).fill(false))

    // 深度优先遍历
    const dfs = (r, c, flow) => { // r行 c列 flow太平洋或大西洋
        flow[r][c] = true;
        [[r-1, c],[r+1, c],[r, c-1],[r, c+1]].forEach(([nr, nc]) => { // 下一个节点的行、列
            if(
                // 保证在矩阵中
                nr >=0 && nr<m && 
                nc >=0 && nc<c &&
                // 防止死循环,必须没有访问过
                !flow[nr][nc] &&
                // 保证逆流而上
                matrix[nr][nc] >= matrix[r][c]
            ){  
                dfs(nr, nc, flow)
            }
        })
    }

    // 沿着海岸线逆流而上
    for(let r=0; r<m ;r+=1){
        dfs(r, 0, flow1) // 第1行到m行,列为0的进行dfs,第一列流到太平洋
        dfs(r, n-1, flow2) // 第1行到m行,遍历最后一列的格子,对这些格子进行dfs,最后一列流到大西洋
    }
    for(let c=0; c<n; c+=1){
        dfs(0,c,flow1) // 遍历第一行的格子进行dfs搜索
        dfs(m-1,c,flow1) // 遍历最后一行的格子进行dfs搜索
    }
    // 收集两个大洋里的坐标
    const res=[]
    for(let r=0;r<m;r+=1){
        for(let c=0;c<n;c+=1){
            if(flow1[r][c]&&flow2[r][c]){
                res.push([r,c]) // 能流到太平洋或大西洋
            }
        }
    }
    return res
};

133. 克隆图

// 深度优先搜索
var cloneGraph = function (node) {
    if(!node) return
    const visited = new Map() 
    const dfs=(n)=>{
        const nCopy = new Node(n.val) 
        visited.set(n, nCopy); // 存储原来节点和拷贝节点的映射关系
        (n.neighbors||[]).forEach(ne=>{
            if(!visited.has(ne)){
                dfs(ne)
            }
            nCopy.neighbors.push(visited.get(ne))
        })
    }
    dfs(node)
    return visited.get(node)
}
// 广度优先搜索
var cloneGraph = function (node) {
    if(!node) return
    const visited = new Map()
    visited.set(node, new Node(node.val))
    const q = [node]
    while(q.length){
        const n = q.shift();
        (n.neighbors||[]).forEach(ne=>{
            if(!visited.has(ne)){
                q.push(ne)
                visited.set(ne, new Node(ne.val))
            }
            visited.get(n).neighbors.push(visited.get(ne))
        })
    }
    return visited.get(node)
}
``
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值