LeetCode-Redundant Connection
阿新 • • 發佈:2018-11-11
一、Description
題目描述:給定一個二維陣列,分別代表一個無向圖的一條邊,從陣列中去掉一條邊,使得該圖可以成為一棵樹(無迴路),如果有多個答案,返回陣列中靠後的那條邊。
Example 1:
Input: [[1,2], [1,3], [2,3]]
Output: [2,3]
Explanation: The given undirected graph will be like this:
1
/ \
2 - 3
Example 2:
Input: [[1,2], [2,3], [3,4], [1,4], [1,5]] Output: [1,4] Explanation: The given undirected graph will be like this: 5 - 1 - 2 | | 4 - 3
二、Analyzation
這個題其實跟樹沒有太大關係,剛開始一直想著用鄰接矩陣存邊,再怎麼遍歷到每個點,後來覺得想複雜了,直接用並查集求是否連通即可。從開始遍歷陣列,每次訪問一條邊<u, v>,先判斷u和v是否連通,如果不連通就join這兩個點,否則說明當前邊是重複的,就返回當前的這兩個點new int[]{u, v}。
關於並查集的講解,可以看我這篇文章:並查集詳解,圖解講得很詳細。
三、Accepted code
class Solution { int[] pre; public int[] findRedundantConnection(int[][] edges) { if (edges == null) { return new int[2]; } int n = edges.length; pre = new int[n + 1]; for (int i = 0; i < n; i++) { pre[i] = i; } for (int i = 0; i < n; i++) { int u = edges[i][0]; int v = edges[i][1]; int fx = Find(u), fy = Find(v); if (fx != fy) { pre[fy] = fx; } else { return new int[]{u, v}; } } return new int[2]; } public int Find(int x) { int r = x; while (r != pre[r]) r = pre[r]; int i = x, j; while (pre[i] != r) { j = pre[i]; pre[i] = r; i = j; } return r; } }