# [#997 Graph: Find the Town Judge](https://leetcode.com/problems/find-the-town-judge/) ###### tags:`Graph` `Easy` <br> ## Issue In a town, there are n people labeled from 1 to n. There is a rumor that one of these people is secretly the town judge. If the town judge exists, then: The town judge trusts nobody. Everybody (except for the town judge) trusts the town judge. There is exactly one person that satisfies properties 1 and 2. You are given an array trust where trust[i] = [ai, bi] representing that the person labeled ai trusts the person labeled bi. Return the label of the town judge if the town judge exists and can be identified, or return -1 otherwise. ### 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 ``` ### Constraints: * 1 <= n <= 1000 * 0 <= trust.length <= 104 * trust[i].length == 2 * All the pairs of trust are unique. * ai != bi * 1 <= ai, bi <= n :::danger Please mind the case when n = 1 ::: ### Optimal Space & Time Complexity :::spoiler Answer * Time complexity: O(N) where N stands for N people * Space complexity: O(N) where N stands for N people ::: <br> ## Solutions ### Most votes :::spoiler Solution <br /> [[C++/Java/Python3/Javascript] Everything you need to know from start to end](https://leetcode.com/problems/find-the-town-judge/discuss/1663344/C%2B%2BJavaPython3Javascript-Everything-you-need-to-know-from-start-to-end-.) ```javascript= var findJudge = function(n, trust) { const Trusted = new Array(n+1).fill(0); for(let [i,j] of trust) { Trusted[i] -= 1 Trusted[j] += 1 } for(let i = 1; i < Trusted.length; i++) { if ((n-1) === Trusted[i]) { return i; } } return -1 }; ``` ::: ### Everyone's :::spoiler 東 ```javascript= /* Graph with adjacency list Time O(n^2) | Space (n^2) - n is the number of person in village */ var findJudge = function(n, trust) { const trustList = {}; for(const [personLabel, trustedPersonLabel] of trust){ if(!(personLabel in trustList)){ trustList[personLabel] = [trustedPersonLabel] } else { trustList[personLabel].push(trustedPersonLabel); } } let possibleJudge = -1; for(let person = 1; person <= n; person ++){ if(!(person in trustList)){ possibleJudge = person; for(let otherPerson = 1; otherPerson <= n; otherPerson++){ if(otherPerson !== possibleJudge){ if(!trustList[otherPerson] || !trustList[otherPerson].includes(possibleJudge)){ possibleJudge = -1; break; } } } if(possibleJudge !== -1){ return possibleJudge; } } } return possibleJudge; }; ``` <br> ```javascript /* Graph with matrix Time O(n^2) | Space O(n^2) - n is the number of person in village */ var findJudge = function(n, trust) { const trustMatrix = new Array(n).fill().map(() => new Array(n).fill(0)); for(const [person, trustedPerson] of trust){ trustMatrix[person-1][trustedPerson-1] = 1; } for(let person = 1; person <= n; person++){ let possibleJudge = person; for(let other = 1; other <= n; other++){ if(other !== person && (trustMatrix[person-1][other-1] !== 0 || trustMatrix[other-1][person-1] !== 1)){ possibleJudge = -1; break; } } if(possibleJudge !== -1) return possibleJudge; } return -1; }; ``` <br> ```javascript /* Calculation of amount of people one trust and being trusted Time O(m) | Space O(n) - m is the length of trust array, n is the number of person in village */ var findJudge = function(n, trust) { const trustRecord = new Array(n+1).fill().map(() => new Array(2).fill(0)); for(const [person, trustedPerson] of trust){ trustRecord[person][0] += 1; trustRecord[trustedPerson][1] += 1; } for(let person = 1; person <= n; person ++){ const [trustCnt, beTrustedCnt] = trustRecord[person]; if(trustCnt === 0 && beTrustedCnt === n - 1) return person; } return -1; }; ``` ::: <br> :::spoiler Hao <br /> It seems little verbose the way to deal with case when `n = 1` here. ```javascript= /** * Time complexity: O(N) where N stands for N people * Space complexity: O(N) where N stands for N people */ var findJudge = function(n, trust) { if (n === 1) return 1; else { const judgeCandidates = {}; trust.forEach(([a, whoATrust]) => { if (judgeCandidates[whoATrust] === undefined) judgeCandidates[whoATrust] = 1; else if (judgeCandidates[whoATrust] > 0) judgeCandidates[whoATrust] += 1; judgeCandidates[a] = -1; }); for (let key in judgeCandidates) { if (judgeCandidates[key] === n - 1) return key; }; return -1; } }; ``` ::: <br> :::spoiler YC ```javascript= var findJudge = function(n, trust) { /* time: O(n) - where n is the total number of people living in the town space: O(n) - where n is the total number of people living in the town */ const trusted = new Array(n+1).fill(0); for (let [trustor,trustee] of trust) { trusted[trustor]--; trusted[trustee]++; } for (let i = 1; i <= n; i++) { if (trusted[i] === n-1) { return i; } } return -1; }; ``` ::: <br> :::spoiler Becky ```javascript= ``` ::: <br> :::spoiler 月薪 ```javascript= // Time: O(n), Space O(n) var findJudge = function(n, trust) { if(n === 1 && trust.length === 0) return n; const map = { candidates: [], trusts: [] }; trust.forEach((i) => { const truster = i[0], trustee = i[1]; map.trusts.push(truster); if(trustee in map){ map[trustee] += 1; }else{ map[trustee] = 1; } if(map[trustee] === n - 1){ map.candidates.push(trustee); } }) if(map.candidates.length === 1){ for(let v of map.trusts){ if(map.candidates[0] === v) return -1 } return map.candidates[0] } return -1 }; ``` ::: <br> ## Discussion ### Why is this leetcode related to `graph`? ### Is the most efficient time complexity O(N) or O(M), which N stands for the number of people in town nd M stands for the length of array 'trust'