难度: 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)******
最重要的就是两点:
- 所有人都相信 town judge
- 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