997. Find the Town Judge
leetcode easy
Task
В городе есть n человек, помеченных от 1 до n. Ходят слухи, что один из этих людей тайно является городским судьей. Если городской судья существует, то: городской судья никому не доверяет. Все (кроме городского судьи) доверяют городскому судье. Существует ровно один человек, удовлетворяющий свойствам 1 и 2. Вам дан массив trust, где trust[i] = [ai, bi], представляющий, что человек, помеченный ai, доверяет человеку, помеченному bi. Если в массиве trust не существует доверительных отношений, то таких отношений не существует. Верните метку городского судьи, если городской судья существует и может быть идентифицирован, или верните -1 в противном случае.
Пример:
Input: n = 2, trust = [[1,2]]
Output: 2
C# solution
matched/originalpublic class Solution {
public int FindJudge(int n, int[][] trust) {
if (trust.Length == 0 && n == 1) {
return 1;
}
int[] trustCount = new int[n + 1];
int[] trustedBy = new int[n + 1];
foreach (var t in trust) {
trustCount[t[0]]++;
trustedBy[t[1]]++;
}
for (int i = 1; i <= n; i++) {
if (trustCount[i] == 0 && trustedBy[i] == n - 1) {
return i;
}
}
return -1;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int FindJudge(int n, int[][] trust) {
if (trust.size() == 0 && n == 1) {
return 1;
}
vector<int>& trustCount = new int[n + 1];
vector<int>& trustedBy = new int[n + 1];
foreach (var t in trust) {
trustCount[t[0]]++;
trustedBy[t[1]]++;
}
for (int i = 1; i <= n; i++) {
if (trustCount[i] == 0 && trustedBy[i] == n - 1) {
return i;
}
}
return -1;
}
}Java solution
auto-draft, review before submitimport java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class Solution {
public int FindJudge(int n, int[][] trust) {
if (trust.length == 0 && n == 1) {
return 1;
}
int[] trustCount = new int[n + 1];
int[] trustedBy = new int[n + 1];
foreach (var t in trust) {
trustCount[t[0]]++;
trustedBy[t[1]]++;
}
for (int i = 1; i <= n; i++) {
if (trustCount[i] == 0 && trustedBy[i] == n - 1) {
return i;
}
}
return -1;
}
}JavaScript solution
matched/originalclass Solution {
findJudge(n, trust) {
if (trust.length === 0 && n === 1) return 1;
const trustCount = new Array(n + 1).fill(0);
const trustedBy = new Array(n + 1).fill(0);
for (const [a, b] of trust) {
trustCount[a]++;
trustedBy[b]++;
}
for (let i = 1; i <= n; i++) {
if (trustCount[i] === 0 && trustedBy[i] === n - 1) {
return i;
}
}
return -1;
}
}Python solution
matched/originalclass Solution:
def findJudge(self, n: int, trust: List[List[int]]) -> int:
if not trust and n == 1:
return 1
trust_count = [0] * (n + 1)
trusted_by = [0] * (n + 1)
for a, b in trust:
trust_count[a] += 1
trusted_by[b] += 1
for i in range(1, n + 1):
if trust_count[i] == 0 and trusted_by[i] == n - 1:
return i
return -1Explanation
Algorithm
1⃣Создание счетчиков доверия:
Инициализируйте массив для подсчета количества людей, которым доверяет каждый человек, и массив для подсчета количества людей, которые доверяют каждому человеку.
2⃣Подсчет доверия:
Пройдитесь по каждому элементу в массиве trust и обновите счетчики: увеличьте количество доверий для того, кто доверяет, и увеличьте количество доверенных людей для того, кому доверяют.
3⃣Проверка условий судьи:
Пройдитесь по массиву людей и найдите того, кто никому не доверяет (количество доверий равно 0) и кому доверяют все остальные (количество доверенных людей равно n-1). Верните метку этого человека. Если такого человека нет, верните -1.
😎