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的点,这样一来我们在遍历数组时对每个点的出入度进行修改,并在最后进行统一的判断即可得到最终的答案。