Javaの実装LeetCode 684冗長接続(互いに素なセット)

684冗長接続

この問題では、ツリーは、通信手段と非環式無向グラフです。

Nを有するノード(ノードの値が1を繰り返さない、2、...、N)と、1つの付加的なツリーエッジ構成から成るマップを入力します。1 Nの中間の頂点に含まれる2つの追加のエッジが、この追加のエッジが既にツリーエッジには存在しません。

図結果は、その側面に二次元アレイです。各側要素は、U <Vを満たす、[U、V]の組であり、uおよびvは、図の自由端に接続された頂点を表します。

戻り側は、結果がN個のノードを有する図ツリーであるように、省略することができます。、複数回答がある場合は、二次元配列の最後の発生が戻されます。回答エッジ[U、V]と同じフォーマットU <Vを満たすべきです。

例1:

输入: [[1,2], [1,3], [2,3]]
输出: [2,3]
解释: 给定的无向图为:
  1
 / \
2 - 3

例2:

输入: [[1,2], [2,3], [3,4], [1,4], [1,5]]
输出: [1,4]
解释: 给定的无向图为:
5 - 1 - 2
    |   |
    4 - 3

注意:

3から1000の入力二次元アレイのサイズ。
Nは、入力配列のサイズは1とNの間の整数の2次元配列。
アップデート(2017年9月26日):
私たちは、テストケースの再検討の問題と説明を持って、明確なグラフは無向グラフです。冗長に接続するためのIIは、図を参照してください。任意の不便のために、私たちは謝罪します。

class Solution {
     int[] f;
    boolean union(int a,int b){
        int n=0;
        //找a的父级
        while(a!=f[a]){
            a=f[a];
            n++;
        }
        //找b的父级
        while(b!=f[b]){
            b=f[b];
            n--;
        }
        //如果相等,就可以跳出了,
        if(a==b){
            return false;
        }
        //不相等,n>0说明a的深度高,就把a给f[b]
        //反之,b的深度高,就把b给f[a]
        if(n>0){
            f[b]=a;
        }else{
            f[a]=b;
        }
        return true;
    }
    public int[] findRedundantConnection(int[][] edges) {
        f=new int[edges.length+1];
        for(int i=0;i<f.length;i++){
            f[i]=i;
        }
        for(int[] e:edges){
            if(!union(e[0],e[1])){
                return e;
            }
        }
        return new int[]{};
    }
}
リリース1732元の記事 ウォンの賞賛30000 + ビュー357万+

おすすめ

転載: blog.csdn.net/a1439775520/article/details/105313487