[LeetCode] 684.冗長接続(中)(JAVA)1日1つの質問

[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を満たす必要があります。

問題解決方法

  1. 採用して見つける
  2. 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%を上回っています

私の公式アカウントに注意を払うことを歓迎します、LeetCodeは毎日1つの質問を更新します

おすすめ

転載: blog.csdn.net/qq_16927853/article/details/112553203