前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >997. 找到小镇的法官

997. 找到小镇的法官

作者头像
chuckQu
发布2022-08-19 15:04:16
2000
发布2022-08-19 15:04:16
举报
文章被收录于专栏:前端F2E

997. 找到小镇的法官

力扣题目链接[1]

小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。

如果小镇法官真的存在,那么:

小镇法官不会信任任何人。每个人(除了小镇法官)都信任这位小镇法官。只有一个人同时满足属性 1 和属性 2 。给你一个数组 trust ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。

如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -1 。

「示例 1:」

代码语言:javascript
复制
输入:n = 3, trust = [[1,3],[2,3]]
输出:3

提示:

  • 1 <= n <= 1000
  • 0 <= trust.length <= 10^4
  • trust[i].length == 2
  • trust 中的所有trust[i] = [ai, bi] 互不相同
  • ai != bi
  • 1 <= ai, bi <= n

思路:

本题考查图的应用。按照题目描述,可以发现法官节点的特点是其余所有节点都指向它,而它不指向任何节点。

也就是说,法官的入度是n - 1 ,出度是0

那么可以创建拥有N + 1个节点的图(数组),每个节点包含了出度和入度信息。至于为什么要多个节点,是因为题目是从1~n的顺序编号,多创建一个空节点,就不需要操心下标不对齐的问题了。

然后遍历二维数组,内层数组的第一项就是对应节点的出度,第二项就是对应节点的入度。

最后需要找出出度为0,入度为n - 1的节点,且要排除第一个节点,具体原因已经说明。最后返回该节点即可。

代码语言:javascript
复制
/**
 * @param {number} n
 * @param {number[][]} trust
 * @return {number}
 */
var findJudge = function(n, trust) {
    let graph = Array.from({ length: n + 1 }, () => ({ outDegree: 0, inDegree: 0 }));
    for (const [a, b] of trust) {
        graph[a].outDegree++;
        graph[b].inDegree++;
    }
    return graph.findIndex(({ outDegree, inDegree }, index) => {
        return index !== 0 && outDegree === 0 && inDegree === n - 1; 
    })
};

总结

本题涉及到图的相关概念。一般来说,图可分为有向图和无向图。有向图的所有边都有方向,即确定了顶点到顶点的一个指向;而无向图的所有边都是双向的,即无向边所连接的两个顶点可以互相到达。在一些问题中,可以把无向图当作所有边都是正向和负向的两条有向边组成。顶点的度是指和该顶点相连的边的条数。特别是对于有向图来说,顶点的出边条数称为该顶点的「出度」,顶点的入边条数称为该顶点的「入度」。而本题就是有向图,也引申出了出度和入度的概念。

这里使用数组来实现图这种数据结构,每一项都包含图中节点的入度信息和出度信息。

参考资料

[1]

力扣题目链接: https://leetcode-cn.com/problems/find-the-town-judge/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端F2E 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 997. 找到小镇的法官
      • 总结
        • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档