【LeetCode每日一题】——997.找到小镇的法官

一【题目类别】

二【题目难度】

  • 简单

三【题目编号】

  • 997.找到小镇的法官

四【题目描述】

  • 在一个小镇里,按从 1 到 N 标记了 N 个人。传言称,这些人中有一个是小镇上的秘密法官。
  • 如果小镇的法官真的存在,那么:
  • 小镇的法官不相信任何人。
  • 每个人(除了小镇法官外)都信任小镇的法官。
  • 只有一个人同时满足属性 1 和属性 2 。
  • 给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示标记为 a 的人信任标记为 b 的人。
  • 如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的标记。否则,返回 -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
  • 示例 4:
    输入:N = 3, trust = [[1,2],[2,3]]
    输出:-1
  • 示例 5:
    输入:N = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
    输出:3

六【题目提示】

  • 1 <= N <= 1000
  • trust.length <= 10000
  • trust[i] 是完全不同的
  • trust[i][0] != trust[i][1]
  • 1 <= trust[i][0], trust[i][1] <= N

七【解题思路】

  • 根据题意可知,法官不相信任何人也就是法官的出度为0,所有人都相信法官也就是法官的入度为N-1,所以只要遍历二维数组最后出度为0,入度为N-1的那个人就是法官

八【时间频度】

  • 时间复杂度: O ( N ) O(N) O(N)

九【代码实现】

  1. Java语言版
package Graph;

public class p997_FindTheTownJudge {

    public static void main(String[] args) {
        p997_FindTheTownJudge p997_findTheTownJudge = new p997_FindTheTownJudge();
        int N = 3;
        int[][] trust = {
                {1, 3},
                {2, 3},
        };
        int res = p997_findTheTownJudge.findJudge(N, trust);
        System.out.println("res = " + res);
    }

    public int findJudge(int N, int[][] trust) {
        // 统计出入度之和
        int[] count = new int[N + 1];
        for (int[] row : trust) {
            // 出度
            count[row[0]]--;
            // 入度
            count[row[1]]++;
        }
        for (int i = 1; i <= N; i++) {
            if (count[i] == N - 1) {
                return i;
            }
        }
        return -1;
    }

}
  1. C语言版
#include<stdio.h>
#include<stdlib.h>

/*
	trustSize:表示对数
	*trustColSize:表示每队是两个
 */
int findJudge(int N, int** trust, int trustSize, int* trustColSize) {

	int cnt[999999 + 1]; /*999999就是N,这里用来占位,因为编译器的原因,不能在数组初始化时用没有定义的常量,记得用的时候替换成N*/
	memset(cnt, 0, sizeof(int) * (N + 1));

	// 如果被信任,则cnt++,如果信任了别人,则cnt置为-1,肯定不是法官,以后cnt不再增加
	for (int i = 0; i < trustSize; i++)
	{
		if (cnt[trust[i][1]] >= 0)
		{
			cnt[trust[i][1]]++;
		}
		cnt[trust[i][0]] = -1;
	}

	// 被信任数是N - 1的则是法官
	for (int i = 1; i <= N; i++)
	{
		if (cnt[i] == N - 1) 
		{
			return i;
		}
	}
	return -1;

}

int main(void) {
	/*主函数省略*/
}

十【提交结果】

  1. Java语言版
    在这里插入图片描述
  2. C语言版
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值