997. Find the Town Judge - Explanation
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.
Return the label of the town judge if the town judge exists and can be identified, or return -1 otherwise.
Example 1:
Input: n = 4, trust = [[1,3],[4,3],[2,3]]
Output: 3Example 2:
Input: n = 3, trust = [[1,3],[2,3],[3,1],[3,2]]
Output: -1Constraints:
1 <= n <= 10000 <= trust.length <= 10,000trust[i].length == 2- All the pairs of
trustare unique. trust[i][0] != trust[i][1]1 <= trust[i][0], trust[i][1] <= n
Topics
Prerequisites
Before attempting this problem, you should be comfortable with:
- Graph Basics (Directed Graphs) - Understanding how to model relationships as directed edges between nodes
- Indegree and Outdegree - Counting incoming and outgoing edges for each vertex in a graph
- Arrays/Hash Maps - Using arrays or dictionaries to count occurrences
1. Indegree & Outdegree
Intuition
The town judge is trusted by everyone else but trusts nobody. In graph terms, if we model trust relationships as directed edges, the judge has an indegree of n - 1 (everyone trusts them) and an outdegree of 0 (they trust nobody). We simply count incoming and outgoing edges for each person and find the one matching these criteria.
Algorithm
- Create two arrays:
incomingandoutgoing, both of sizen + 1. - For each trust pair
[a, b]:- Increment
outgoing[a](personatrusts someone). - Increment
incoming[b](personbis trusted by someone).
- Increment
- Iterate through persons
1ton:- If
outgoing[i] == 0andincoming[i] == n - 1, returni.
- If
- Return
-1if no judge found.
class Solution:
def findJudge(self, n: int, trust: List[List[int]]) -> int:
incoming = defaultdict(int)
outgoing = defaultdict(int)
for src, dst in trust:
outgoing[src] += 1
incoming[dst] += 1
for i in range(1, n + 1):
if outgoing[i] == 0 and incoming[i] == n - 1:
return i
return -1Time & Space Complexity
- Time complexity:
- Space complexity:
Where is the number of vertices and is the number of edges.
2. Indegree & Outdegree (Optimal)
Intuition
We can combine the two arrays into one by using the difference: delta[i] = incoming[i] - outgoing[i]. The judge has n - 1 people trusting them and trusts 0 people, so their delta equals (n - 1) - 0 = n - 1. Anyone who trusts at least one person will have a delta less than n - 1.
Algorithm
- Create a single array
deltaof sizen + 1. - For each trust pair
[a, b]:- Decrement
delta[a](personatrusts someone, reducing their score). - Increment
delta[b](personbis trusted, increasing their score).
- Decrement
- Iterate through persons
1ton:- If
delta[i] == n - 1, returni.
- If
- Return
-1if no judge found.
Time & Space Complexity
- Time complexity:
- Space complexity:
Where is the number of vertices and is the number of edges.
Common Pitfalls
Only Checking Indegree Without Outdegree
The town judge must be trusted by everyone (indegree = n-1) AND trust nobody (outdegree = 0). A common mistake is only checking that someone is trusted by n-1 people, which would incorrectly identify a person who also trusts others.
Off-by-One Errors with 1-Indexed People
People are labeled from 1 to n, not 0 to n-1. When using arrays indexed from 0, forgetting to iterate from 1 to n (inclusive) or incorrectly accessing array indices can cause out-of-bounds errors or missed candidates.
Sign in to join the discussion