997. Find the Town Judge

本文介绍了一种算法,用于在一个标记从1到N的人群中找出可能存在的小镇法官。法官不信任任何人,但除了他自己外,每个人都信任他。通过解析信任关系数组,文章详细解释了如何确定满足条件的法官是否存在及其身份。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

In a town, there are N people labelled from 1 to N.  There is a rumor that one of these people is secretly the town judge.

If the town judge exists, then:

  1. The town judge trusts nobody.
  2. Everybody (except for the town judge) trusts the town judge.
  3. There is exactly one person that satisfies properties 1 and 2.

You are given trust, an array of pairs trust[i] = [a, b] representing that the person labelled a trusts the person labelled b.

If the town judge exists and can be identified, return the label of the town judge.  Otherwise, return -1.

 

Example 1:

Input: N = 2, trust = [[1,2]]
Output: 2

Example 2:

Input: N = 3, trust = [[1,3],[2,3]]
Output: 3

Example 3:

Input: N = 3, trust = [[1,3],[2,3],[3,1]]
Output: -1

Example 4:

Input: N = 3, trust = [[1,2],[2,3]]
Output: -1

Example 5:

Input: N = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
Output: 3

 

Note:

  1. 1 <= N <= 1000
  2. trust.length <= 10000
  3. trust[i] are all different
  4. trust[i][0] != trust[i][1]
  5. 1 <= trust[i][0], trust[i][1] <= N

题解:别看题目有点长,但其实都是唬人的。把trust数组遍历一遍,建立一个矩阵,但是不同长,然后在遍历一遍矩阵,如果他的flag为true,就代表他有信任的人,就说明他不是town judge,如果有且仅有一个person,信任他的人数是N-1,并且他的flag不为true,则返回1,否则返回-1

/**
 * @param {number} N
 * @param {number[][]} trust
 * @return {number}
 */
var findJudge = function(N, trust) {
   let flag = new Array(N)
   let tr = new Array(N)
   let len = trust.length
   for(let i = 1; i <= N; i ++) {
       tr[i] = []
   }
   for(let i = 0; i < len; i ++) {
       flag[trust[i][0]] = true
       if(!flag[trust[i][1]]) {
           tr[trust[i][1]].push(trust[i][0])
       }
   }
    let ans = -1
    for(let i = 1; i <= N; i ++) {
        if(!flag[i] && tr[i].length === N - 1) {
            if(ans !== -1) return -1
            else ans = i
        } 
    }
    return ans
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值