997. Find the Town Judge - Explanation

Problem Link

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:

  1. The town judge trusts nobody.
  2. Everybody (except for the town judge) trusts the town judge.
  3. 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: 3

Example 2:

Input: n = 3, trust = [[1,3],[2,3],[3,1],[3,2]]

Output: -1

Constraints:

  • 1 <= n <= 1000
  • 0 <= trust.length <= 10,000
  • trust[i].length == 2
  • All the pairs of trust are unique.
  • trust[i][0] != trust[i][1]
  • 1 <= trust[i][0], trust[i][1] <= n


Topics

Company Tags

Please upgrade to NeetCode Pro to view company tags.



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

  1. Create two arrays: incoming and outgoing, both of size n + 1.
  2. For each trust pair [a, b]:
    • Increment outgoing[a] (person a trusts someone).
    • Increment incoming[b] (person b is trusted by someone).
  3. Iterate through persons 1 to n:
    • If outgoing[i] == 0 and incoming[i] == n - 1, return i.
  4. Return -1 if 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 -1

Time & Space Complexity

  • Time complexity: O(V+E)O(V + E)
  • Space complexity: O(V)O(V)

Where VV is the number of vertices and EE 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

  1. Create a single array delta of size n + 1.
  2. For each trust pair [a, b]:
    • Decrement delta[a] (person a trusts someone, reducing their score).
    • Increment delta[b] (person b is trusted, increasing their score).
  3. Iterate through persons 1 to n:
    • If delta[i] == n - 1, return i.
  4. Return -1 if no judge found.
class Solution:
    def findJudge(self, n: int, trust: List[List[int]]) -> int:
        delta = defaultdict(int)

        for src, dst in trust:
            delta[src] -= 1
            delta[dst] += 1

        for i in range(1, n + 1):
            if delta[i] == n - 1:
                return i

        return -1

Time & Space Complexity

  • Time complexity: O(V+E)O(V + E)
  • Space complexity: O(V)O(V)

Where VV is the number of vertices and EE 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.