问题

力扣:找到小镇的法官

这个问题可以抽象成:在 n × n n×n n×n 矩阵中,是否存在 i i i,使得

  • 第 i i i 列除第 i i i 项以外所有项都是 1 1 1;
  • 第 i i i 行除第 i i i 项以外所有项都是 0 0 0。

思路

这题看似只有 O ( n 2 ) O(n^2) O(n2) 时间的暴力解,然而有一种思路可以让最坏运行时间降到 O ( n ) O(n) O(n),是这样的:
考虑 n n n 个人中任意 2 2 2 个人的关系,如果 A A A 信任 B B B,则 A A A 一定不是法官(因为法官不信任任何人);如果 A A A 不信任 B B B,则 B B B 一定不是法官(因为任何人都信任法官)。我们断言法官不是他俩其中一个。我们留下其中一人,剔除另一人,于是法官候选人数从 n n n 变为 n − 1 n-1 n−1。一直如此筛选,直到只剩下 1 1 1 个人。可以看出这个过程需要 O ( n ) O(n) O(n) 时间。
下面需要测试这个人是否真的是法官。我们先问 TA:「请问你不信任其他所有人吗?」,再问其他人所有人:「请问你信任 TA 吗?」如果不满足必要条件,TA 就不是法官。

代码

const int maxn=1003;
bool tr[maxn][maxn]; //tr[i][j]表示i信任j与否
int cand;
class Solution {public:int findJudge(int n, vector<vector<int>>& trusts) {//第一步:把矩阵建出来memset(tr,0,sizeof(tr));for(auto&trust:trusts)tr[trust[0]][trust[1]]=true;//第二步:筛选法官候选人(这里用3个变量模拟出了元素为[1,2,...,n]的队列)int i=1,j=2;for(int nxt=3;nxt<=n+1;++nxt){if(tr[i][j])i=nxt;else j=nxt;}if(i==n+1)cand=j;else cand=i;//第三步:测试cand真的是法官bool isjudge=true;//有些时候需要添加这行代码以便测试通过(这题是不用的)//tr[cand][cand]=false;for(i=1;isjudge&&i<=n;++i){//如果他信任了某人,那肯定不对if(tr[cand][i])isjudge=false;//如果某人不信任他,除非是他自己,那肯定也不对(排除了多个法官的情况)if(!tr[i][cand]&&i!=cand)isjudge=false;}if(isjudge)return cand;else return -1;}
};

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2),因为这里用邻接矩阵替代了邻接链表来简化代码

参考文献

[1] Udi Manber. Introduction to Algorithms: A Creative Approach[M]. 黄林鹏等译. 北京:电子工业出版社, 2006.12.

找到小镇的法官(社会名流问题)相关推荐

  1. 【快乐水题】997. 找到小镇的法官

    原题: 力扣链接:997. 找到小镇的法官 题目简述: 在一个小镇里,按从 1 到 n 为 n 个人进行编号.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相 ...

  2. Python3求解找到小镇的法官问题

    Python3求解找到小镇的法官问题 原题 https://leetcode-cn.com/problems/find-the-town-judge/ 题目: 在一个小镇里,按从 1 到 N 标记了 ...

  3. 997. 找到小镇的法官_小镇...

    997. 找到小镇的法官 Bethlehem Media Net strives to be the "voice of the voiceless" bringing the s ...

  4. leetcode 997 找到小镇的法官

    https://leetcode-cn.com/problems/find-the-town-judge/ 题目 在一个小镇里,按从111到nnn为nnn个人进行编号.传言称,这些人中有一个是小镇上的 ...

  5. 力扣题目——997. 找到小镇的法官

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 在一个小镇里,按从 1 到 n 为 n 个人进行编号.传言称,这些人中有一个 ...

  6. LeetCode 997. 找到小镇的法官(图的出度和入度)

    1. 题目 在一个小镇里,按从 1 到 N 标记了 N 个人.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相信任何人. 每个人(除了小镇法官外)都信任小镇的 ...

  7. 997. 找到小镇的法官

    在一个小镇里,按从 1 到 N 标记了 N 个人.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相信任何人. 每个人(除了小镇法官外)都信任小镇的法官. 只有 ...

  8. 每日一题python90:找到小镇的法官

    题目:小镇里有 n 个人,按从 1 到 n 的顺序编号.传言称,这些人中有一个暗地里是小镇法官.如果小镇法官真的存在,那么:小镇法官不会信任任何人.每个人(除了小镇法官)都信任这位小镇法官.只有一个人 ...

  9. leetcode(力扣) 997. 找到小镇的法官 (剧本杀推理)

    文章目录 题目描述: 思路分析 完整代码: 题目描述: 小镇里有 n 个人,按从 1 到 n 的顺序编号.传言称,这些人中有一个暗地里是小镇法官. 如果小镇法官真的存在,那么: 小镇法官不会信任任何人 ...

最新文章

  1. 安装Windows Storage Server 2008 R2
  2. javascript与三角函数之二:圆周运动
  3. C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中
  4. 第五章 数组、矩阵与广义表
  5. m个苹果放入n个盘子问题
  6. UVA 10624 Super Number
  7. 震惊!原来leetcode竟然真的能中奖?
  8. 计算机网络rip工作原理,12. 小型网络 RIP 协议工作原理
  9. 高通AR系列与MTK芯片对比专业详解
  10. 清除/收缩SQL Server数据库日志
  11. Java机器学习库(Java ML)(二、聚类)
  12. Redis——修改redis配置文件,并使配置生效
  13. 华为手机中的计算机怎么用高级,华为手机DLNA怎么用 华为DLNA共享多媒体文件使用教程...
  14. 手机的模拟,有耗电和充电方法, 有电量的属性
  15. Python编程从入门到实践---pygame精灵组
  16. 微信小程序-开放标签
  17. 【信奥题库 NOIP 2020 在线模拟赛 T1】有趣的函数
  18. 织梦Dedecms主要文件夹目录及模板文件说明
  19. excel 两日期相减
  20. 南非认证_现在...南非

热门文章

  1. 【前端知识之CSS】CSS3动画
  2. 红帽25周年:从Linux转型成为开源云平台公司
  3. html5用css做样式边框,纯CSS3实现自定义Tooltip边框 涂鸦风格
  4. 龙珠直播前50信息爬取并保存图片和天池排名爬取
  5. 数据库建表语句改成数据字典到word
  6. solidworks 怎么画两条直线不连续画线
  7. 怎么合并视频?快把这些方法收好
  8. “百付宝”带来百度未来格局的真正悬念
  9. 百付宝携手瑞星 打造零风险支付平台
  10. python苹果电脑下载_Python3 Mac版下载