997.找到小镇的法官

/**
 * @param {number} n
 * @param {number[][]} trust
 * @return {number}
 */
var findJudge = function (n, trust) {
    // 法官不相信任何人
    // 其他人都相信法官
    // 一个人可以信任多个人

    // 特殊情况,只有一个人
    if (n === 1 && trust.length === 0) {
        return n
    }

    let countMap = new Map() // 哈希表记录被相信的次数
    let trustedMap = new Map() // 记录每个人是否相信过人,因为法官不相信任何人,后续好做判断

    for (let i = 0; i < trust.length; i++) {
        let person = trust[i][0]
        let trt = trust[i][1]
        trustedMap.set(person, true) // 这个人相信过其他人
        countMap.set(trt, (countMap.get(trt) || 0) + 1)
    }

    // console.log(countMap, trustedMap)

    for (let [trt, cnt] of countMap) {
        // 所有人都相信法官,所以是n-1
        // 并且法官不相信任何人
        if (cnt === n - 1 && !trustedMap.has(trt)) {
            return trt
        }
    }
    return -1
};

/**
 * @param {number} n
 * @param {number[][]} trust
 * @return {number}
 */
var findJudge = function (n, trust) {
    // 有向图的出度和入度
    let inDegrees = new Array(n + 1).fill(0) //入度,即该人被多少人信任。注意人员编号从1开始,所以这里n+1方便计算
    let outDegrees = new Array(n + 1).fill(0) // 出度,即该人信任了多少人。

    for (let i = 0; i < trust.length; i++) {
        let myself = trust[i][0] // 自己
        let trt = trust[i][1] // 信任的人
        outDegrees[myself]++ // 自己出度+1
        inDegrees[trt]++ // 被信任的人入度+1
    }

    // 注意人员编号从1开始
    for (let i = 1; i < inDegrees.length; i++) {
        // 法官满足入度为n-1,且出度为0
        if (inDegrees[i] === n - 1 && outDegrees[i] === 0) {
            return i
        }
    }
    return -1
}