LeetCode_997_找到小镇的法官
Posted 想名真难
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode_997_找到小镇的法官相关的知识,希望对你有一定的参考价值。
小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。
如果小镇法官真的存在,那么:
- 小镇法官不会信任任何人。
- 每个人(除了小镇法官)都信任这位小镇法官。
- 只有一个人同时满足属性 1 和属性 2 。
给你一个数组 trust ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。
如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -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
额, 读懂题目都花了一段时间, 其中有个条件题目没有明确说出来, 一个人可以信任多个人, 同时多个人也可以信任一个人, 既有1对多, 又有多对1, 是不是有点有向图的感觉了.
用一个数组beTruseArray存放被人信任的数量, 下表为人, 值为被信任的数量.比如beTruseArray[3] = 5, 表示下表为3的人, 被5个人信任; beTruseArray[4] = 1, 表示,下表为4的人 被1个人信任. 有了这个数组找到一个index, 使得 beTruseArray[index] == n-1 , 那这个index就可能是法官了, 我们先叫他 疑似法官
题目还有一个要求, 法官不会信任何人, 验证这个条件, 有2种方式
- 可以通过在遍历一次trust来处理,
- 如果疑似法官的人有任何信任的人, 就可以返回-1,
- 如果遍历完, 疑似法官无任何信任的人, 那说明他就是法官了, 返回index
- 上面的方案还需要一次遍历, 可以通过在第一次遍历生成beTruseArray的时候, 在同时生成一个数组personTrustArray, 数组的下表为人, 值为这个人信任的所有人构成的数组, 比如personTrustArray[3] = [1,2], 表示下表为3的人, 信任1,2; personTrustArray[1] = [2], 表示下表为1的人信任2.
当需要验证疑似法官时, 直接取出personTrustArray[index],- 如果这个数组不为空, 那说明满足index还信任其他人, 不满足条件, 返回 -1
- 如果这个数组为空, 那说明满足法官条件, 返回index
class Solution
func findJudge(_ n: Int, _ trust: [[Int]]) -> Int
if n == 1
return 1
// 下表为人, 值为被信任的数量
var beTruseArray = Array.init(repeating: 0, count: n+1)
// 下表为人, 值为这个人信任的所有人构成的数组
var personTrustArray = Array.init(repeating: [Int](), count: n+1)
for onePersonArray in trust
let person = onePersonArray.first!
let trustPerson = onePersonArray.last!
beTruseArray[trustPerson] += 1
personTrustArray[person].append(trustPerson)
// 找到信任数为n-1的人,这个人可能是法官
if let index = beTruseArray.firstIndex(of: n-1)
// 在看信任数为n-1的人,有没有信任其他人,
// 无信任其他人, 符合法官条件
// 有信任其他人, 不符合法官条件
if personTrustArray[index].isEmpty
return index
else
return -1
return -1
时间复杂度是O(N), 只需要遍历一次就可以完成所有判断.
以上是关于LeetCode_997_找到小镇的法官的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—997. 找到小镇的法官( 百度算法)—day90
LeetCode 997. 找到小镇的法官 / 475. 供暖器 / 1154. 一年中的第几天
leetcode 997. 找到小镇的法官(Find the Town Judge)