一、题目
小镇里有n个人,按从1到n的顺序编号。传言称,这些人中有一个暗地里是小镇法官。
如果小镇法官真的存在,那么:
1、小镇法官不会信任任何人。
2、每个人(除了小镇法官)都信任这位小镇法官。
3、只有一个人同时满足属性1和属性2。 给你一个数组trust,其中trust[i]=[ai, bi]表示编号为ai的人信任编号为bi的人。 如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回-1。
示例 1:
输入:n = 2, trust = [[1,2]]
输出:2
示例 2:
输入:n = 3, trust = [[1,3],[2,3]]
输出:3
示例 3:
输入:n = 3, trust = [[1,3],[2,3],[3,1]]
输出:-1
二、思路
1、使用图的思想,trust就相当于表的节点对应关系,用邻接表的方式存储小镇居民i和其信任对象j的关系
2、因为要满足两个条件,可以将n×n的表压缩成2×n的表,只需要判断居民i没有信任别人以及居民i被所有人信任,用第一行记录居民i被别人信任的次数,用第二行记录居民i是否信任别人
三、代码
代码如下(示例):
package leetcode.editor.cn;
import java.util.Scanner;
/**
* 找到小镇的法官
* @author CJ
* @date 2022-07-14 08:51:06
*/
class P997_FindTheTownJudge{
public static void main(String[] args) {
//测试代码
Solution solution = new P997_FindTheTownJudge().new Solution();
Scanner sc=new Scanner(System.in);
System.out.println("please input 小镇做题家数量(狗头:");
int n=sc.nextInt();
System.out.println("please input trust数组有多少行");
int x=sc.nextInt();
System.out.println("please input num:");
int matrix[][] = new int[x][2];//定义一个二维数组
System.out.println("输入矩阵:");
//从键盘上输入一个二维数组
for (int i = 0; i < x; i++) {
for (int j = 0; j < 2; j++) {
matrix[i][j] = sc.nextInt();
}
}
int res=solution.findJudge(n,matrix);
System.out.println(res);
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int findJudge(int n, int[][] trust) {
// 想把n*n矩阵压缩成一个2*n的线性矩阵
int[][] num=new int[2][n+1];
for(int i=0;i<trust.length;i++){
// 如果该人被信任,那就对应位置+1
num[0][trust[i][1]]+=1;
// 如果信任的别人,那自己的位置就是1,信任的次数可以不设上限
num[1][trust[i][0]]+=1;
}
for(int i=1;i<n+1;i++){
if(num[0][i]==n-1&&num[1][i]==0) {
// 每个人(除了小镇法官)都信任这位小镇法官
return i;
}
}
return -1;
}
}
}
四、总结
根据条件结合图的邻接表的思想灵活考虑,将表压缩成2×n维可以减少运行时间