1. 程式人生 > 實用技巧 >LeetCode 684 冗餘連線

LeetCode 684 冗餘連線

LeetCode 684 冗餘連線

題目描述:
在本問題中, 樹指的是一個連通且無環的無向圖。
輸入一個圖,該圖由一個有著N個節點 (節點值不重複1, 2, ..., N) 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1N中間,這條附加的邊不屬於樹中已存在的邊。
結果圖是一個以邊組成的二維陣列。每一個邊的元素是一對[u, v] ,滿足 u < v,表示連線頂點u 和v的無向圖的邊。
返回一條可以刪去的邊,使得結果圖是一個有著N個節點的樹。如果有多個答案,則返回二維陣列中最後出現的邊。答案邊 [u, v] 應滿足相同的格式 u < v

並查集
按照edges中的順序對邊進行遍歷並建立並查集,返回第一次出現環的邊(唯一)

執行用時:1 ms, 在所有 Java 提交中擊敗了97.15%的使用者
記憶體消耗:40 MB, 在所有 Java 提交中擊敗了68.88%的使用者

class Solution {
    public int[] findRedundantConnection(int[][] edges) {
        //按edges中的順序建立連通圖,返回第一次出現環時的邊
        int[] result = null;
        int[] nodes = new int[edges.length+1];
        Arrays.fill(nodes, -1);
        for(int[] edge: edges) {
            if(!union(edge[0], edge[1], nodes)) {
                result = edge;
            }
        }
        return result;
    }

    public int findRoot(int x, int[] nodes) {
        while(nodes[x]!=-1) {
            x = nodes[x];
        }
        return x;
    }

    public boolean union(int x, int y, int[] nodes) {
        int rootX = findRoot(x, nodes);
        int rootY = findRoot(y, nodes);
        if(rootX==rootY) {
            return false;
        }
        nodes[rootX] = rootY;
        return true;
    }
}