無駄に年年無駄にしました。今日、私たちは質問を支払います。
問題は簡単でleetcodeが困難なことである、私は本当に私は本当にああ認めたくはありません、終了しませんでした。
次のように内容は次のとおりです。
リストを与えられたdominoes
、 dominoes[i] = [a, b]
ある同等のdominoes[j] = [c, d]
場合にのみのいずれか(a==c
およびb==d
)、または(a==d
及びb==c
) -つまり、あるドミノが他のドミノに等しくなるように回転させることができます。
ペアの数を返し(i, j)
たため0 <= i < j < dominoes.length
、と dominoes[i]
同等ですdominoes[j]
ソリューション:
最初は、私はそれが等しいかどうかを比較するために使用された民間の方法で、ループのための暴力のダブル考える。結果は、テスト時間の複雑さが高すぎるということです、それは受け入れています。
誰か他の人のソリューションを読んで、オリジナルのアイデアは、コードを以下のように、ということです。
公共INT numEquivDominoPairsは(INT [] []ドミノ)は{ INT []のRES = {0}。 地図<整数、整数>マップ=新しいHashMapの<>(); int型のキー= 0; (INT [] D:ドミノ)のための{ キー= Math.min(D [0]、D [1])* 10 + Math.max(D [0]、D [1])。 map.put(キー、map.getOrDefault(鍵、0)+ 1)。 } map.forEach((K、V) - > { RES [0] + = V×(V - 1)/ 2; }); 戻りRES [0]。 }
アイデアは、アレイは、10進数または文字列に変換される要素です。内部のマップ上の結果の数値や文字列。次いで、順列及び組合せ演算結果。RESの= Cの(2 / V)
以下の溶液を、次いで直接累積結果をカウントされます。
公共INT numEquivDominoPairs([] []ドミノをINT){ int型RES = 0。 int型のキー= 0; 地図<整数、整数>マップ=新しいHashMapの<>(); (INT [] D:ドミノ)のための{ キー= Math.min(D [0]、D [1])* 10 + Math.max(D [0]、D [1])。 RES + = map.getOrDefault(鍵、0); map.put(キー、map.getOrDefault(鍵、0)+ 1)。 } RESを返します。 }