在一個(gè)小鎮(zhèn)里,按從 1 到 n 為 n 個(gè)人進(jìn)行編號(hào)。傳言稱(chēng),這些人中有一個(gè)是小鎮(zhèn)上的秘密法官。
如果小鎮(zhèn)的法官真的存在,那么:
????????????小鎮(zhèn)的法官不相信任何人。
????????????每個(gè)人(除了小鎮(zhèn)法官外)都信任小鎮(zhèn)的法官。
????????????只有一個(gè)人同時(shí)滿(mǎn)足條件 1 和條件 2 。
給定數(shù)組?trust,該數(shù)組由信任對(duì) trust[i] = [a, b]?組成,表示編號(hào)為 a 的人信任編號(hào)為 b 的人。
如果小鎮(zhèn)存在秘密法官并且可以確定他的身份,請(qǐng)返回該法官的編號(hào)。否則,返回 -1。
示例 1:輸入:n = 2, trust = [[1,2]]? ? 輸出:2
示例 2:輸入:n = 3, trust = [[1,3],[2,3],[3,1]]? ??輸出:-1
解題思路:可以構(gòu)造一個(gè)關(guān)于各節(jié)點(diǎn)的hash表,這個(gè)hash表是二維的,hash[i][0]表示i-1節(jié)點(diǎn)的入度,hash[i][1]表示i-1節(jié)點(diǎn)的出度。由題可知,法官節(jié)點(diǎn)的入度為n-1,出度為0。
public?int?findJudge(int?n,?int[][]?trust)?{
????????int[][]?hashTable?=?new?int[n][2]; // 構(gòu)造hash表
????????for(int[]?tmp?:?trust)?{
????????????hashTable[tmp[1]-1][0]++;? //? tmp[1]-1節(jié)點(diǎn)的入度加1
????????????hashTable[tmp[0]-1][1]++;? //? tmp[0]-1節(jié)點(diǎn)的出度加1
????????}
????????for(int?i=0;?i<n;?i++)?{
????????????if(hashTable[i][0]==n-1?&&?hashTable[i][1]==0)?{ // 如果i節(jié)點(diǎn)的入度為n-1,出度為0
????????????????return?i+1;? // 則返回法官編號(hào)i+1
????????????}
????????}
????????return?-1; //否則返回-1
????}