刷题小记 (28) LeetCode 997 找到小镇的法官

LeetCode 997

2020.8.29

我的通过代码

class Solution {
    public int findJudge(int N, int[][] trust) {
        int[][] p = new int[N][2]; //两列分别为入度和出度
        for(int[] person : trust) {
            int out = person[0];
            int in = person[1];
            p[out-1][1]++; //out是相信谁
            p[in-1][0]++;  //in是被谁相信
        }
        for(int i=0;i<N;i++) {
            if(p[i][0]==N-1&&p[i][1]==0) return i+1;
        }
        return -1;

    }
}

这题,着实给我制造了很大的麻烦,也可能是第一次写图的题目,没摸清套路。

首先看这个题目,一个民风淳朴的小镇,只有一个法官,这个法官谁也不信,其他村民都相信他。

这个条件听起来很好满足,只要找到那个没出现在数组左边的数字就好了嘛。

问题就在这里,用户的输入总是意想不到了,且不说那种,N=4但是数组为[]的情况,就连那种A相信B但B相信C的情况,我也没想到。

好不容易解决了他们,又出现了一个人相信多个人的情况。A既相信B,也相信C,这就更复杂了,而且仔细看看题目好像也没说不会有这样的情况发生。

。。。

我一开始想的简单,觉得遍历数组就可以解决。但多次提交失败碰上那些奇怪的情形之后,简单的遍历数组便不再适用了。

这个时候就应该想到图的性质了。把这个题的情况看作一个有向图,那么图的任意一个节点都有自己的入度和出度,而我们要找的法官,就是一个入度为所有村民数量且出度为0的点,这样一来我们在遍历数组时对每个点的出入度进行修改,并在最后进行统一的判断即可得到最终的答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值