#997 Find the Town Judge

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.

Examples

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

思路

其实题目给出的town judge的第三个定义是重复的,如果他被n-1个人信任,那必然一个town中只能存在一个judge,否则不符合1/2定义,也就是要么没有town judge,要么只有一个

题目不难(毕竟是easy),但一开始的时候我被《图》的思维束缚住了,所以想的方法是构建一个倒过来的邻接矩阵,也就是从终止节点指向开始节点,这样在一开始的遍历中先找到那些没有出度的点,再在所有没有出度的点中找到入度等于n-1的点

但仔细阅读上面那段话会发现,事情根本没有这么复杂啊!只要计算所有节点的 (入度-出度),让它等于 n-1 就可以了啊!

两个代码都附上,记录一下蠢蠢的思路hhhh

代码

构建邻接矩阵

class Solution {
    public int findJudge(int n, int[][] trust) {
        List<Integer> peopleWhoTrustNone = new ArrayList<>();
        List<List<Integer>> beTrust = new ArrayList<>();
        
        for (int i = 0; i <= n; i++){
            peopleWhoTrustNone.add(i);
            beTrust.add(new ArrayList<>());
        }
        
        for (int[] t: trust){
            beTrust.get(t[1]).add(t[0]);
            peopleWhoTrustNone.remove(Integer.valueOf(t[0]));
        }
        
        if (peopleWhoTrustNone.size() == 1)
            return -1;
        
        while (peopleWhoTrustNone.size() > 1){
            int candidate = peopleWhoTrustNone.get(1);
            if (beTrust.get(candidate).size() == n - 1){
                return candidate;
            }
            peopleWhoTrustNone.remove(1);
        }
        
        return -1;
    }
}

入度-出度

class Solution {
    public int findJudge(int n, int[][] trust) {
        int[] trustTimes = new int[n + 1];
        for (int[] t: trust){
            trustTimes[t[0]] -= 1;
            trustTimes[t[1]] += 1;
        }
        
        for (int i = 1; i < n + 1; i++){
            if (trustTimes[i] == n - 1)
                return i;
        }
        return -1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值