LeetCode 面试题 04.01. 节点间通路

文章目录

一、题目

节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。

点击此处跳转题目

示例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, 105]范围内。
  • 节点编号大于等于 0 小于 n。
  • 图中可能存在自环和平行边。

二、C# 题解

使用BFS方法寻找通路,代码如下:

csharp 复制代码
public class Solution {
    public bool FindWhetherExistsPath(int n, int[][] graph, int start, int target) {
        // 建立邻接表
        Dictionary<int, List<int>> dic = new Dictionary<int, List<int>>();
        for (int i = 0; i < graph.Length; i++) {
            int p = graph[i][0], q = graph[i][1];
            if (dic.ContainsKey(p) && !dic[p].Contains(q)) dic[p].Add(q);
            else dic[p] = new List<int> {q};
        }

        // BFS
        Queue<int> queue = new Queue<int>();
        queue.Enqueue(start);
        do {
            int node = queue.Dequeue();               // 取出结点
            if (node == target) return true;          // 判断是否为目标对象
            if (!dic.ContainsKey(node)) continue;     // 如果邻接表不存在该结点,则直接跳过
            for (int i = 0; i < dic[node].Count; i++) // 遍历邻接表,继续找后续节点
                queue.Enqueue(dic[node][i]);
            dic.Remove(node);                         // 访问过该结点,因此从邻接表中删除记录
        } while (queue.Count != 0);
        return false;
    }
}
  • 时间复杂度: O ( n + e ) O(n+e) O(n+e),其中 e e e 为有向图的边数。
  • 空间复杂度: O ( n ) O(n) O(n)。
相关推荐
Baihai_IDP8 小时前
为什么 AI 巨头们放弃私有壁垒,争相拥抱 Agent Skills
人工智能·面试·llm
Moment8 小时前
Agent 开发本质上就是高级点的 CRUD
前端·后端·面试
哈里谢顿18 小时前
0305乒乓xx agent运维开发岗面试记录
面试
哈里谢顿19 小时前
0309面试二总结
面试
哈里谢顿19 小时前
0309面试一记录
面试
哈里谢顿19 小时前
0310面试二记录
面试
哈里谢顿19 小时前
0310面试记录一
面试
boooooooom1 天前
讲清 Proxy + effect + track/trigger 流程
javascript·vue.js·面试
豆苗学前端1 天前
彻底讲透浏览器缓存机制,吊打面试官
前端·javascript·面试
zone77391 天前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试