Description
In a town, there are n people labeled 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 an array trust where trust[i] = [ai, bi] representing that the person labeled ai trusts the person labeled bi. If a trust relationship does not exist in trust array, then such a trust relationship does not exist.
Return the label of the town judge if the town judge exists and can be identified, or return -1 otherwise.
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
Constraints:
1 <= n <= 10000 <= trust.length <= 104trust[i].length == 2- All the pairs of
trustare unique. ai != bi1 <= ai, bi <= n
Solutions
Solution 1: Counting
We create two arrays cnt1 and cnt2 of length n + 1, representing the number of people each person trusts and the number of people who trust each person, respectively.
Next, we traverse the array trust, for each item [ai, bi], we increment cnt1[ai] and cnt2[bi] by 1.
Finally, we enumerate each person i in the range [1,..n]. If cnt1[i] = 0 and cnt2[i] = n - 1, it means that i is the town judge, and we return i. Otherwise, if no such person is found after the traversal, we return -1.
The time complexity is O(n), and the space complexity is O(n). Here, n is the length of the array trust.
class Solution: def findJudge(self, n: int, trust: List[List[int]]) -> int: cnt1 = [0] * (n + 1) cnt2 = [0] * (n + 1) for a, b in trust: cnt1[a] += 1 cnt2[b] += 1 for i in range(1, n + 1): if cnt1[i] == 0 and cnt2[i] == n - 1: return i return -1(code-box)
