程序员面试金典---6

节点间通路

思路:邻接表+递归

实例:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2

首先构建邻接表

0->1->2
1->2

然后对每一行递归,查看是否能到达。

此外:还需要创建一个visited记录是否被访问过,出现环的问题

/**
 * @param {number} n
 * @param {number[][]} graph
 * @param {number} start
 * @param {number} target
 * @return {boolean}
 */
var findWhetherExistsPath = function(n, graph, start, target) {
    const isCanReach = function(arr,start,target,visited){
        // 如果到了
        if(start === target) return true
        // 如果被访问过了,说明有环,
        if(visited.has(start))return false
        // 添加访问
        visited.add(start)
        // 循环邻接表的每一行
        for(let next of arr[start]){
            // 如果当前行可以存在路径
            if(isCanReach(arr, next, target, visited)) return true
        }

        return false
    }

    // 邻接表
    // 0->1->2
    // 1->2
    let arr = []
    for(let i = 0; i < n; i++){
        arr.push(new Set())
    }

    for(let [s, e] of graph){
        arr[s].add(e)
    }
    // 记录是否被访问过,防止出现环
    const visited = new Set()
    // 递归遍历
    return isCanReach(arr,start,target,visited)
};
posted @   楸枰~  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示