【力扣时间】【997】【简单】找到小镇的法官

本来想着星期天给来到简单,真是对我们这些社畜的仁慈。
但读了题却十分懵逼,好在再看了两眼才放下心来。

1、简单题也能醒脑!

点我康题
今天题目的难度就在题目。
读懂了题目你就会做这题目。
你搁这搁这呢?

2、审题

相信大家都看到标签里的“图”了。
这题确实可以转换为点的入度来考虑,但仅有想法就行,实现起来不用多么复杂。

推荐大家自己多审审题,不过我这里还是放出自己提炼的重点:

  1. 法官不相信任何人。即法官这个点没有出度。
  2. 每个人(除了小镇法官外)都信任小镇的法官。即法官的入度为N-1。
  3. 只有一个人同时满足条件 1 和条件 2这句话实际上是废话 同时满足1和2的仅有法官,而题目已经保证了法官的数量仅有1个。

3、思路

在审题中,题目实际上已经帮我们缕清了重点了。
我们将小镇的每个人看成图上的一个点。
trust[]则是每个点的单向连通路径。

由于法官没有出度,则可以保证trust[0]必定不是法官。
由于法官的入度为N-1,则我们为每个trust[1]指向的点的计数。如果能得出有且仅有一个点的入度为N-1,那么他就是法官。

胜利的法则已经确定!

4、撸代码

class Solution {
    public int findJudge(int n, int[][] trust) {
        int[] arr = new int[n + 1];

        for (int[] t : trust) {
            //t[0]信任t[1]
            //则t[0]必不可能为法官
            arr[t[0]] = -1;
            //被信任的t[1],如果未排除是法官,则使计数+1
            if (arr[t[1]] != -1) {
                ++arr[t[1]];
            }
        }

        for (int i = 1; i <= n; i++) {
            //遍历列表,如果有计数为n-1的,即为法官
            if (arr[i] == n - 1) {
                return i;
            }
        }

        return -1;
    }
}

收工!算上注释3分半不到。

5、解读

额……
由于代码本就十分简洁了,再加上我在思路中已经把流程写得十分清晰,这里就没有什么可以解读的了。

大家可以结合注释多看看。

6、提交

在这里插入图片描述
不愧只是简单题嘛。

7、咀嚼

嗯……
整体遍历了两遍
第一遍是trust[],设长度为M,第二遍是所以的点的入度统计,长度为N。
则时间复杂度为O(M+N)
空间复杂度O(N)。从内存消耗排名看是用多了,但谁在乎呢?

8、取长补短

没看到什么特别牛逼的黑科技,就学我这套就行了!
在这里插入图片描述

9、总结

今天是简单题,难度全在题目里面。
虽然用到了图的思想,但也仅擦了边,所以没有什么难度可言。

毕竟是休息日嘛,大家也多放松放送吧。

明天又是周一了……
啊……不想返工啊……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值