997.找到小鎮(zhèn)的法官 哈希表模擬确买、數(shù)組投票選舉 雙解!

997.找到小鎮(zhèn)的法官

https://leetcode-cn.com/problems/find-the-town-judge/solution/997zhao-dao-xiao-zhen-de-fa-guan-ha-xi-b-x7eu/

難度:簡單

題目

在一個小鎮(zhèn)里纱皆,按從 1 到 n 為 n 個人進行編號湾趾。傳言稱,這些人中有一個是小鎮(zhèn)上的秘密法官派草。

如果小鎮(zhèn)的法官真的存在搀缠,那么:

  1. 小鎮(zhèn)的法官不相信任何人。
  2. 每個人(除了小鎮(zhèn)法官外)都信任小鎮(zhèn)的法官近迁。
  3. 只有一個人同時滿足條件 1 和條件 2 艺普。

給定數(shù)組 trust,該數(shù)組由信任對 trust[i] = [a, b] 組成鉴竭,表示編號為 a 的人信任編號為 b 的人歧譬。

如果小鎮(zhèn)存在秘密法官并且可以確定他的身份,請返回該法官的編號搏存。否則瑰步,返回 -1。

提示:

  • 1 <= n <= 1000
  • 0 <= trust.length <= 10 ^ 4
  • trust[i].length == 2
  • trust[i] 互不相同
  • trust[i][0] != trust[i][1]
  • 1 <= trust[i][0], trust[i][1] <= n

示例

示例 1:
輸入:n = 2, trust = [[1,2]]
輸出:2

示例 2:
輸入:n = 3, trust = [[1,3],[2,3]]
輸出:3

示例 3:
輸入:n = 3, trust = [[1,3],[2,3],[3,1]]
輸出:-1
示例 4:
輸入:n = 3, trust = [[1,2],[2,3]]
輸出:-1

示例 5:
輸入:n = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
輸出:3

分析

模擬解法
這道題其實是一道閱讀理解的題目璧眠,重要的解題思路就是這句:
只有一個人同時滿足條件 1 和條件 2缩焦。
通過這句話兵钮,我們可以得到結(jié)論:
假設村里有N個人,如果x為法官舌界,則需要滿足:

  1. 除X外的其他人都是村民,且其他人都信賴法官
  2. 法官x不信賴任何人

知道這兩點泰演,就足夠解題了呻拌。思路如下:

  1. 首先我們維護一個包含 1 - N 的HashSet people,作為所有村民的集合
  2. 然后維護一個HashMap judge 來作為可能是法官的人選睦焕,其中key為人員id藐握,value為被信賴的人數(shù)
  3. 遍歷trust
  4. 如果trust[i][0] 在 people 中表示它是村民,因為他有信賴的人垃喊,刪除它
  5. trust[i][1] 可能是法官猾普,將其加入judge中,并將信賴人數(shù) += 1
  6. 最終如果 people 長度不為1本谜,表示有多個人未信任其他人初家,返回-1
  7. 最終如果 people 長度1,則查看該人在 judge 中的信任度乌助,是否為N - 1,即出他外的所有人都信任他
  8. 如果7的結(jié)果為N - 1溜在,表示他就是法官,返回people他托,否則返回 -1

投票解法
我們可以將這道題目理解為投票選舉的模式掖肋。
我們現(xiàn)在要選舉村民X,當法官赏参,要求全村進行投票志笼,X自己不能投票給任何人。
那么最終如果X能選舉上把篓,表示他一共獲取了N - 1張票纫溃。
這樣的思維,我們維護一個全零數(shù)組li韧掩,然后遍歷trust變更index對應的村民value值皇耗。
待遍歷結(jié)束后,查看數(shù)組li中是否有value值為N - 1的人即可揍很。

模擬解法

Python:

class Solution:
    def findJudge(self, n, trust):
        people, judge = set(range(1, n + 1)), defaultdict(int)
        for p, j in trust:
            if p in people:
                people.remove(p)
            judge[j] += 1
        if len(people) != 1:
            return -1
        person = people.pop()
        return -1 if judge.get(person, 0) != n - 1 else person

Java:

class Solution {
    public int findJudge(int n, int[][] trust) {
        HashSet<Integer> people = new HashSet<>();
        HashMap<Integer, Integer> judge = new HashMap<>();
        for (int i = 1; i < n + 1; i++) {
            people.add(i);
        }
        for (int[] condition : trust) {
            int p = condition[0];
            int j = condition[1];
            people.remove(p);
            judge.put(j, judge.getOrDefault(j, 0) + 1);
        }
        if (people.size() != 1) {
            return -1;
        }
        int person = people.iterator().next();
        return judge.getOrDefault(person, 0) == n - 1 ? person : -1;
    }
}

投票解法

Python:

class Solution:
    def findJudge(self, n, trust):
        li = [0] * (n + 1)
        for i, j in trust:
            li[i] -= 1
            li[j] += 1
        for i in range(1, n + 1):
            if li[i] == n - 1:
                return i
        return -1

Java:

class Solution {
    public int findJudge(int n, int[][] trust) {
        int[] li = new int[n + 1];
        for (int[] condition : trust) {
            li[condition[0]]--;
            li[condition[1]]++;
        }
        for (int i = 1; i < n + 1; i++) {
            if (li[i] == n - 1) {
                return i;
            }
        }
        return -1;
    }
}

歡迎關注我的公眾號: 清風Python郎楼,帶你每日學習Python算法刷題的同時,了解更多python小知識窒悔。

我的個人博客:https://qingfengpython.cn

力扣解題合集:https://github.com/BreezePython/AlgorithmMarkdown

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呜袁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子简珠,更是在濱河造成了極大的恐慌阶界,老刑警劉巖虹钮,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異膘融,居然都是意外死亡芙粱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門氧映,熙熙樓的掌柜王于貴愁眉苦臉地迎上來春畔,“玉大人,你說我怎么就攤上這事岛都÷梢蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵臼疫,是天一觀的道長择份。 經(jīng)常有香客問我,道長烫堤,這世上最難降的妖魔是什么荣赶? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鸽斟,結(jié)果婚禮上讯壶,老公的妹妹穿的比我還像新娘。我一直安慰自己湾盗,他們只是感情好伏蚊,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著格粪,像睡著了一般躏吊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帐萎,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天比伏,我揣著相機與錄音,去河邊找鬼疆导。 笑死赁项,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的澈段。 我是一名探鬼主播悠菜,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼败富!你這毒婦竟也來了悔醋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兽叮,失蹤者是張志新(化名)和其女友劉穎芬骄,沒想到半個月后猾愿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡账阻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年蒂秘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淘太。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡姻僧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琴儿,到底是詐尸還是另有隱情,我是刑警寧澤嘁捷,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布造成,位于F島的核電站,受9級特大地震影響雄嚣,放射性物質(zhì)發(fā)生泄漏晒屎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一缓升、第九天 我趴在偏房一處隱蔽的房頂上張望鼓鲁。 院中可真熱鬧,春花似錦港谊、人聲如沸骇吭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燥狰。三九已至,卻和暖如春斜筐,著一層夾襖步出監(jiān)牢的瞬間龙致,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工顷链, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留目代,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓嗤练,卻偏偏與公主長得像榛了,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子煞抬,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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