持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
一、题目描述:
节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
示例1:
输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2 输出:true 示例2:
输入:n = 5, graph = [[0, 1], [0, 2], [0, 4], [0, 4], [0, 1], [1, 3], [1, 4], [1, 3], [2, 3], [3, 4]], start = 0, target = 4 输出 true 提示:
节点数量n在[0, 1e5]范围内。 节点编号大于等于 0 小于 n。 图中可能存在自环和平行边。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/ro… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
- 使用DFS「深度优先搜索」进行递归搜索确,确保当前路径未被访问,为了防止图中自环出现死循环的情况,逐渐压缩搜索区间,直至最终找到
start与target在同一个路径内,则说明查找成功, - 当图出现闭环时,则会出现死循环情况,为了防止这种情况,就必须在每次递归的过程中标志已走的路径。
- 采用DFS解决的过程中,应当注意当正序递归搜索时,会出现超时的情况,采用逆序搜索的方法解决
三、AC 代码:
class Solution {
private boolean[] visited = null;
public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) {
this.visited = new boolean[graph.length];
return helper(graph, start, target);
}
private boolean helper(int[][] graph, int start, int target) {
for (int i = 0; i < graph.length; ++i) {
if (!visited[i]) {
if (graph[i][0] == start && graph[i][1] == target) {
return true;
}
visited[i] = true;
if (graph[i][1] == target && helper(graph, start, graph[i][0])) {
return true;
}
visited[i] = false;
}
}
return false;
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助,期待您找到心意的工作和满意的offer
期待下次再见~
\