Leetcode0997. 找到小镇的法官(simple)

1. 问题描述

小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。

如果小镇法官真的存在,那么:

  1. 小镇法官不会信任任何人。
  2. 每个人(除了小镇法官)都信任这位小镇法官。
  3. 只有一个人同时满足属性 1 和属性 2 。

给你一个数组 trust ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。

如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -1 。

示例 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

提示:

  • 1 <= n <= 1000
  • 0 <= trust.length <= 10^4
  • trust[i].length == 2
  • trust 中的所有trust[i] = [ai, bi] 互不相同
  • ai != bi
  • 1 <= ai, bi <= n

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-town-judge
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题分析

        如果唯一的法官存在的话,则必然满足以下条件:

(1)所有其它人都信任该法官,因此他们每人都至少一次出现在某个trust[i]的第一个元素位置

(2)只有一个人受信任度为n-1,这个人就是法官,而且它没有出现在任意一个trust[i]的第一个元素位置

       用一个哈希表trust_degree(python dict)来管理个人的受信任度,用另一个哈希表non_judge(python set)来管理非法官列表。

        遍历trust,对于每个trust[i]=[ai,bi]:

  • 将ai加入到non_judge,如果ai在trust_degree中则删除它
  • 如果bi不在non_judge中:
    • 如果bi在trust_degree中,将其值加1
    • 如果bi不在trust_degree中,将其加入并将值记为1

        容易忽略的一种情况是小镇只有1人,此时按照题设条件必定trust为空,因为ai和bi必须不相等,因此这种情况下这个唯一的人就是法官。

3. 代码实现

import time
from typing import List
from collections import deque

class Solution:
    def findJudge(self, n: int, trust: List[List[int]]) -> int:
        trust_deg = dict()
        non_judge = set()
        
        for [ai,bi] in trust:
            non_judge.add(ai)
            if ai in trust_deg:
                trust_deg.pop(ai)
            
            if bi not in non_judge:
                if bi in trust_deg:
                    trust_deg[bi] = trust_deg[bi] + 1
                else:
                    trust_deg[bi] = 1
        
        if len(trust_deg)==1:
            a = trust_deg.popitem()
            if a[1] == n - 1:
                return a[0]
        return -1
    
if __name__ == "__main__":
    
    sln = Solution()
    
    n = 2
    trust = [[1,2]]
    print(sln.findJudge(n, trust))
    
    n = 3
    trust = [[1,3],[2,3]]
    print(sln.findJudge(n, trust))
    
    n = 3
    trust = [[1,3],[2,3],[3,1]]
    print(sln.findJudge(n, trust))
            

        执行用时:76 ms, 在所有 Python3 提交中击败了97.45%的用户

        内存消耗:18.2 MB, 在所有 Python3 提交中击败了46.34%的用户

        回到主目录:笨牛慢耕的Leetcode每日一解题解目录(动态更新。。。) 

猜你喜欢

转载自blog.csdn.net/chenxy_bwave/article/details/124288664