程序员面试金典---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) };

浙公网安备 33010602011771号