本来想着星期天给来到简单,真是对我们这些社畜的仁慈。
但读了题却十分懵逼,好在再看了两眼才放下心来。
1、简单题也能醒脑!
点我康题
今天题目的难度就在题目。
读懂了题目你就会做这题目。
(你搁这搁这呢? )
2、审题
相信大家都看到标签里的“图”了。
这题确实可以转换为点的入度来考虑,但仅有想法就行,实现起来不用多么复杂。
推荐大家自己多审审题,不过我这里还是放出自己提炼的重点:
法官不相信任何人
。即法官这个点没有出度。每个人(除了小镇法官外)都信任小镇的法官
。即法官的入度为N-1。只有一个人同时满足条件 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、总结
今天是简单题,难度全在题目里面。
虽然用到了图的思想,但也仅擦了边,所以没有什么难度可言。
毕竟是休息日嘛,大家也多放松放送吧。
明天又是周一了……
啊……不想返工啊……