Skip to content

Latest commit

 

History

History
149 lines (79 loc) · 2.67 KB

0997._Find_the_Town_Judge.md

File metadata and controls

149 lines (79 loc) · 2.67 KB

997. Find the Town Judge

难度: Easy

刷题内容

原题连接

内容描述

In a town, there are N people labelled from 1 to N.  There is a rumor that one of these people is secretly the town judge.

If the town judge exists, then:

The town judge trusts nobody.
Everybody (except for the town judge) trusts the town judge.
There is exactly one person that satisfies properties 1 and 2.
You are given trust, an array of pairs trust[i] = [a, b] representing that the person labelled a trusts the person labelled b.

If the town judge exists and can be identified, return the label of the town judge.  Otherwise, return -1.

 

Example 1:

Input: N = 2, trust = [[1,2]]
Output: 2
Example 2:

Input: N = 3, trust = [[1,3],[2,3]]
Output: 3
Example 3:

Input: N = 3, trust = [[1,3],[2,3],[3,1]]
Output: -1
Example 4:

Input: N = 3, trust = [[1,2],[2,3]]
Output: -1
Example 5:

Input: N = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
Output: 3
 

Note:

1 <= N <= 1000
trust.length <= 10000
trust[i] are all different
trust[i][0] != trust[i][1]
1 <= trust[i][0], trust[i][1] <= N

解题方案

思路 1 - 时间复杂度: O(N^2)- 空间复杂度: O(N)******

最重要的就是两点:

  1. 所有人都相信 town judge
  2. town judge 不相信任何人
class Solution:
    def findJudge(self, N: int, trust: List[List[int]]) -> int:
        lookup = collections.defaultdict(set)
        for t in trust:
            lookup[t[0]].add(t[1])
        res = []
        for i in range(1, N+1):
            if len(lookup[i]) != 0:
                continue
            flag = False
            for j in range(1, i):
                if i not in lookup[j]:
                    flag = True
            for j in range(i+1, N+1):
                if i not in lookup[j]:
                    flag = True
            if not flag:
                res.append(i)
        return res[0] if len(res) == 1 else -1

思路 1 - 时间复杂度: O(N)- 空间复杂度: O(N)******

更好的想法,direct graph,被trust和trust别人考虑为入度in与出度out,哪个人出度为N-1,入度为0的话就是town judge

照抄[Java/C++/Python] Directed Graph

class Solution:
    def findJudge(self, N: int, trust: List[List[int]]) -> int:
        count = [0] * (N + 1)
        for i, j in trust:
            count[i] -= 1
            count[j] += 1
        for i in range(1, N + 1):
            if count[i] == N - 1:
                return i
        return -1