684. 冗余连接(Redundant Connection)

频次 ★★★ · 难度 🟡 · 高频:美团

题目

n 个节点(1~n),[u, v] 边,删去一条边使树成立(无环)。有多个解时返回最后出现的边。

思路

并查集检测环:按顺序遍历边,如果 u 和 v 已经在同一集合中,说明当前边会导致环,它就是冗余连接。

代码

public int[] findRedundantConnection(int[][] edges) {
    int n = edges.length;
    int[] parent = new int[n + 1];          // 节点从 1 开始
    for (int i = 1; i <= n; i++) parent[i] = i;
 
    for (int[] e : edges) {
        if (find(parent, e[0]) == find(parent, e[1]))
            return e;                        // 已连通 → 冗余
        union(parent, e[0], e[1]);
    }
    return new int[0];
}
 
private int find(int[] parent, int x) {
    if (parent[x] != x) parent[x] = find(parent, parent[x]);
    return parent[x];
}
 
private void union(int[] parent, int a, int b) {
    parent[find(parent, a)] = find(parent, b);
}

复杂度

  • 时间:O(n α(n))
  • 空间:O(n)

边界条件

  • 题目保证至少有一条冗余边

变式

易错点

  • 节点从 1 开始编号,parent 数组大小 = n + 1
  • 返回的是最后出现的冗余边——因为按顺序遍历,第一条检测到的就是”输入顺序中最后那条导致环的边”

面试追问

  • 有向图版的冗余连接? 需要额外处理入度为 2 的情况,比无向图复杂

关联题