[LeetCode] 684.冗長接続(中)(JAVA)
件名アドレス:https://leetcode.com/problems/redundant-connection/
タイトル説明:
この問題では、ツリーは接続された無向グラフであり、サイクルはありません。
指定された入力は、N個のノード(個別の値1、2、…、N)を持つツリーとして開始され、エッジが1つ追加されたグラフです。追加されたエッジには、1からNまで選択された2つの異なる頂点があり、すでに存在するエッジではありませんでした。
結果のグラフは、エッジの2D配列として提供されます。エッジの各要素は、u <vのペア[u、v]であり、ノードuとvを接続する無向エッジを表します。
結果のグラフがNノードのツリーになるように削除できるエッジを返します。複数の回答がある場合は、指定された2D配列の最後に発生する回答を返します。回答エッジ[u、v]は同じ形式で、u <vである必要があります。
例1:
Input: [[1,2], [1,3], [2,3]]
Output: [2,3]
Explanation: The given undirected graph will be like this:
1
/ \
2 - 3
例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
注意:
- 入力2D配列のサイズは3から1000の間です。
- 2D配列で表されるすべての整数は、1からNの間です。ここで、Nは入力配列のサイズです。
更新(2017-09-26):
問題の説明とテストケースを見直し、グラフが無向グラフであることを明確に指定しました。有向グラフのフォローアップについては、冗長接続II)を参照してください。ご不便をおかけして申し訳ございません。
一般的なアイデア
この問題では、ツリーは接続された非巡回無向グラフを参照します。
N個のノード(ノード値は1、2、…、Nを繰り返さない)と追加のエッジを持つツリーで構成されるグラフを入力します。追加のエッジの2つの頂点は、1とNの間に含まれます。この追加のエッジは、ツリー内の既存のエッジに属していません。
結果のグラフは、エッジの2次元配列です。各エッジの要素は[u、v]のペアであり、u <vを満たし、頂点uとvを接続する無向グラフのエッジを表します。
結果のグラフがNノードのツリーになるように削除できるエッジを返します。複数の回答がある場合は、2次元配列の最後のエッジが返されます。回答側[u、v]は、同じ形式u <vを満たす必要があります。
問題解決方法
- 採用して見つける
- 2つのノードの親ノードが同じである場合は、2つが接続されていることを意味し、結果が直接返されます。2つのノードの親ノードが異なる場合、2つのノードはマージされます。
class Solution {
public int[] findRedundantConnection(int[][] edges) {
int[] fa = new int[edges.length + 1];
for (int i = 0; i < fa.length; i++) {
fa[i] = i;
}
for (int i = 0; i < edges.length; i++) {
if (find(fa, edges[i][0]) == find(fa, edges[i][1])) return edges[i];
merge(fa, edges[i][0], edges[i][1]);
}
return new int[]{-1, -1};
}
private int find(int[] fa, int x) {
if (fa[x] != x) return fa[x] = find(fa, fa[x]);
return fa[x];
}
private void merge(int[] fa, int x, int y) {
fa[find(fa, x)] = find(fa, y);
}
}
実行時間:1ミリ秒、Javaユーザーの87.99%を上回っています
メモリ消費量:38.8 MB、Javaユーザーの34.46%を上回っています