找到小镇的法官(社会名流问题)
问题
力扣:找到小镇的法官
这个问题可以抽象成:在 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.
找到小镇的法官(社会名流问题)相关推荐
- 【快乐水题】997. 找到小镇的法官
原题: 力扣链接:997. 找到小镇的法官 题目简述: 在一个小镇里,按从 1 到 n 为 n 个人进行编号.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相 ...
- Python3求解找到小镇的法官问题
Python3求解找到小镇的法官问题 原题 https://leetcode-cn.com/problems/find-the-town-judge/ 题目: 在一个小镇里,按从 1 到 N 标记了 ...
- 997. 找到小镇的法官_小镇...
997. 找到小镇的法官 Bethlehem Media Net strives to be the "voice of the voiceless" bringing the s ...
- leetcode 997 找到小镇的法官
https://leetcode-cn.com/problems/find-the-town-judge/ 题目 在一个小镇里,按从111到nnn为nnn个人进行编号.传言称,这些人中有一个是小镇上的 ...
- 力扣题目——997. 找到小镇的法官
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 在一个小镇里,按从 1 到 n 为 n 个人进行编号.传言称,这些人中有一个 ...
- LeetCode 997. 找到小镇的法官(图的出度和入度)
1. 题目 在一个小镇里,按从 1 到 N 标记了 N 个人.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相信任何人. 每个人(除了小镇法官外)都信任小镇的 ...
- 997. 找到小镇的法官
在一个小镇里,按从 1 到 N 标记了 N 个人.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相信任何人. 每个人(除了小镇法官外)都信任小镇的法官. 只有 ...
- 每日一题python90:找到小镇的法官
题目:小镇里有 n 个人,按从 1 到 n 的顺序编号.传言称,这些人中有一个暗地里是小镇法官.如果小镇法官真的存在,那么:小镇法官不会信任任何人.每个人(除了小镇法官)都信任这位小镇法官.只有一个人 ...
- leetcode(力扣) 997. 找到小镇的法官 (剧本杀推理)
文章目录 题目描述: 思路分析 完整代码: 题目描述: 小镇里有 n 个人,按从 1 到 n 的顺序编号.传言称,这些人中有一个暗地里是小镇法官. 如果小镇法官真的存在,那么: 小镇法官不会信任任何人 ...
最新文章
- 安装Windows Storage Server 2008 R2
- javascript与三角函数之二:圆周运动
- C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中
- 第五章 数组、矩阵与广义表
- m个苹果放入n个盘子问题
- UVA 10624 Super Number
- 震惊!原来leetcode竟然真的能中奖?
- 计算机网络rip工作原理,12. 小型网络 RIP 协议工作原理
- 高通AR系列与MTK芯片对比专业详解
- 清除/收缩SQL Server数据库日志
- Java机器学习库(Java ML)(二、聚类)
- Redis——修改redis配置文件,并使配置生效
- 华为手机中的计算机怎么用高级,华为手机DLNA怎么用 华为DLNA共享多媒体文件使用教程...
- 手机的模拟,有耗电和充电方法, 有电量的属性
- Python编程从入门到实践---pygame精灵组
- 微信小程序-开放标签
- 【信奥题库 NOIP 2020 在线模拟赛 T1】有趣的函数
- 织梦Dedecms主要文件夹目录及模板文件说明
- excel 两日期相减
- 南非认证_现在...南非