LeetCode.997-找到鎮(zhèn)法官(Find the Town Judge)

這是悅樂書的第373次更新,第400篇原創(chuàng)

01 看題和準(zhǔn)備

今天介紹的是LeetCode算法題中Easy級別的第234題(順位題號是997)兵睛。在一個城鎮(zhèn)醒陆,有N個人從1到N標(biāo)記伊履。有傳言說其中一個人是秘密的鎮(zhèn)法官。

如果鎮(zhèn)法官存在葫录,那么:

  • 鎮(zhèn)法官不信任任何人挺邀。

  • 每個人(鎮(zhèn)法官除外)都信任鎮(zhèn)法官蝠嘉。

  • 只有一個人滿足前兩條缴允。

給定一個trust數(shù)組,一對trust[i] = [a珍德,b]表示被標(biāo)記為a的人信任標(biāo)記為b的人练般。

如果鎮(zhèn)法官存在并且可以識別,則返回鎮(zhèn)法官的標(biāo)簽锈候。否則薄料,返回-1。

例如:

輸入:N = 2泵琳,trust = [[1,2]]
輸出:2

輸入:N = 3摄职,trust = [[1,3],[2,3]]
輸出:3

輸入:N = 3获列,trust = [[1,3]谷市,[2,3],[3,1]]
輸出:-1

輸入:N = 3击孩,trust = [[1,2]迫悠,[2,3]]
輸出:-1

輸入:N = 4,trust = [[1,3]巩梢,[1,4]创泄,[2,3],[2,4]括蝠,[4,3]]
輸出:3

注意

  • 1 <= N <= 1000

  • trust.length <= 10000

  • trust[i]都是不同的鞠抑。

  • trust[i][0] != trust[i][1]

  • 1 <= trust[i][0],trust[i][1] <= N

02 第一種解法

將題目翻譯一下就是忌警,法官的被信任次數(shù)等于N-1搁拙,并且法官不能信任其他人,即法官是trust數(shù)組中trust[i][1]出現(xiàn)次數(shù)等于N-1的人(被信任次數(shù)等于N-1),并且trust[i][0]不等于法官所在的標(biāo)簽(法官不能信任其他人)感混。

思路:利用HashMap記錄被信任人出現(xiàn)的次數(shù)端幼,找出其中被信任了N-1次的人,然后去trust數(shù)組中判斷此人是否有信任過其他人弧满。有種特殊情況N為1的時候婆跑,trust為空數(shù)組,即只有1個人庭呜,那么這個人就是法官滑进。

public int findJudge(int N, int[][] trust) {
    // 只有1個人的時候,法官就是他本人
    if (N == 1) {
        return N;
    }
    // key為被信任的人募谎,value為其被信任的次數(shù)
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int[] arr : trust) {
        map.put(arr[1], map.getOrDefault(arr[1], 0)+1);
    }
    // 找到被信任次數(shù)等于N-1的那個人
    int count = -1;
    for (Integer key : map.keySet()) {
        if (map.get(key) == N-1) {
            count = key;
        }
    }
    // 被信任次數(shù)等于N-1的人扶关,不能信任其他人
    for (int[] arr : trust) {
        if (arr[0] == count) {
            return -1;
        }
    }
    return count;
}


03 第二種解法

針對第一種解法中的HashMap,我們還可以用int數(shù)組進(jìn)行替換数冬,思路和上面第一種解法一致节槐。

public int findJudge2(int N, int[][] trust) {
    if (N == 1) {
        return N;
    }
    int[] trusted = new int[N+1];
    for (int i=0; i<trust.length; i++) {
        trusted[trust[i][1]]++;
    }
    int count = -1;
    for (int i=0; i<trusted.length; i++) {
        if (trusted[i] == N-1) {
            count = i;
        }
    }
    for (int[] arr : trust) {
        if (arr[0] == count) {
            return -1;
        }
    }
    return count;
}


04 第三種解法

針對第二種解法,我們還可以將其簡化成2個for循環(huán)拐纱,將統(tǒng)計被信任次數(shù)和尋找被信任次數(shù)最多的人合在一起處理铜异。

public int findJudge3(int N, int[][] trust) {
    if (N == 1) {
        return N;
    }
    int[] trusted = new int[N+1];
    int count = -1, num = -1;
    for (int i=0; i<trust.length; i++) {
        trusted[trust[i][1]]++;
        if (trusted[trust[i][1]] > count) {
            count = trusted[trust[i][1]];
            num = trust[i][1];
        }
    }
    // 被信任次數(shù)要等于N-1
    if (count != N-1) {
        return -1;
    }
    for (int[] arr : trust) {
        if (arr[0] == num) {
            return -1;
        }
    }
    return num;
}


05 第四種解法

我們還可以使用兩個int數(shù)組來解,一個數(shù)組arr存信任的人秸架,另一個數(shù)組arr2存被信任的人揍庄,找出被信任次數(shù)等于N-1arr2[i]=N-1)且沒有信任過人(arr[i]=0)的人,他就是法官东抹。

public int findJudge4(int N, int[][] trust) {
    int[] arr = new int[N+1];
    int[] arr2 = new int[N+1];
    for (int i=0; i<trust.length; i++) {
        arr[trust[i][0]]++;
        arr2[trust[i][1]]++;
    }
    for (int j=1; j<arr.length; j++) {
        if (arr[j] == 0 && arr2[j] == N-1) {
            return j;
        }
    }
    return -1;
}


06 小結(jié)

算法專題目前已連續(xù)日更超過七個月蚂子,算法題文章240+篇,公眾號對話框回復(fù)【數(shù)據(jù)結(jié)構(gòu)與算法】缭黔、【算法】食茎、【數(shù)據(jù)結(jié)構(gòu)】中的任一關(guān)鍵詞,獲取系列文章合集馏谨。

以上就是全部內(nèi)容董瞻,如果大家有什么好的解法思路、建議或者其他問題田巴,可以下方留言交流钠糊,點贊、留言壹哺、轉(zhuǎn)發(fā)就是對我最大的回報和支持抄伍!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市管宵,隨后出現(xiàn)的幾起案子截珍,更是在濱河造成了極大的恐慌攀甚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岗喉,死亡現(xiàn)場離奇詭異秋度,居然都是意外死亡,警方通過查閱死者的電腦和手機钱床,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門荚斯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人查牌,你說我怎么就攤上這事事期。” “怎么了纸颜?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵兽泣,是天一觀的道長。 經(jīng)常有香客問我胁孙,道長唠倦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任涮较,我火速辦了婚禮牵敷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘法希。我一直安慰自己,他們只是感情好靶瘸,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布苫亦。 她就那樣靜靜地躺著,像睡著了一般怨咪。 火紅的嫁衣襯著肌膚如雪屋剑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天诗眨,我揣著相機與錄音唉匾,去河邊找鬼。 笑死匠楚,一個胖子當(dāng)著我的面吹牛巍膘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芋簿,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峡懈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了与斤?” 一聲冷哼從身側(cè)響起肪康,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤荚恶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磷支,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谒撼,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年雾狈,在試婚紗的時候發(fā)現(xiàn)自己被綠了廓潜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡箍邮,死狀恐怖茉帅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锭弊,我是刑警寧澤堪澎,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站味滞,受9級特大地震影響樱蛤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剑鞍,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一昨凡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚁署,春花似錦便脊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至久妆,卻和暖如春晌杰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筷弦。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工肋演, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烂琴。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓爹殊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奸绷。 傳聞我的和親對象是個殘疾皇子边灭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容