1. 程式人生 > >Leetcode 684.冗余連接

Leetcode 684.冗余連接

有環 script 冗余 如果 輸入 ora fin 數組大小 tco

冗余連接

在本問題中, 樹指的是一個連通且無環的無向圖。

輸入一個圖,該圖由一個有著N個節點 (節點值不重復1, 2, ..., N) 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到N中間,這條附加的邊不屬於樹中已存在的邊。

結果圖是一個以邊組成的二維數組。每一個邊的元素是一對[u, v] ,滿足 u < v,表示連接頂點u 和v的無向圖的邊。

返回一條可以刪去的邊,使得結果圖是一個有著N個節點的樹。如果有多個答案,則返回二維數組中最後出現的邊。答案邊 [u, v] 應滿足相同的格式 u < v。

示例 1:

輸入: [[1,2], [1,3], [2,3]]

輸出:

[2,3]

解釋: 給定的無向圖為:

技術分享圖片

示例 2:

輸入: [[1,2], [2,3], [3,4], [1,4], [1,5]]

輸出: [1,4]

解釋: 給定的無向圖為:

技術分享圖片

註意:

  • 輸入的二維數組大小在 3 到 1000。
  • 二維數組中的整數在1到N之間,其中N是輸入數組的大小。

更新(2017-09-26):
我們已經重新檢查了問題描述及測試用例,明確圖是無向 圖。對於有向圖詳見冗余連接II對於造成任何不便,我們深感歉意。

思路

並查集,new一個數組,用來保存各個節點的根節點(這裏(1,2)是說2是1的根節點),遍歷edges數組時,查找兩個數組的根節點是否相等,相等則證明有環,則返回當前數組。

 1 class Solution {
 2     public int[] findRedundantConnection(int[][] edges) {
 3         int[] nums = new int[2000];
 4 
 5         for(int[] i : edges){
 6             int root1 = find(i[0],nums);
 7             int root2 = find(i[1],nums);
 8             if (root1 == root2)
 9                 return
i; 10 else { 11 nums[root1] = root2; 12 } 13 } 14 return null; 15 16 } 17 18 public static int find(int x, int[] nums){ 19 while (nums[x] != 0){ 20 x = nums[x]; 21 } 22 return x; 23 } 24 }

Leetcode 684.冗余連接