leetcode——277.寻找名人

题目

  1. 有一个名人或者没有名人
  2. 所有人都认识名人,名人不认识所有人
  3. 给出一个二维矩阵,[i,j] = 1 表示 i 认识 j

思路

  1. 同向双指针——这里的双指针运用不是很明显,需要自己研究输入矩阵的规律
  2. 先遍历列——找到一个尽可能所有人认识他的候选人
  3. 再遍历行——候选人是否不认识所有人 以及 确认是否真的所有人认识他

代码

bool knows(int a, int b);
 
class Solution {
public:
    int findCelebrity(int n) {
        int c = 0;
        //通过名人不认识所有人——走0道 将其候选出
        for(int i = 1; i < n; i++)
            c = knows(i, c)?c:i;
        //候选人如果认识别人 或者别人不认识他  则返回-1
        for(int j = 0; i < n; i++)
            if(j != c && (knows(c, j)||!knows(j, c)))
                return -1;
        return c;
    }
};

解释

1
1 0 1 0 0 
0 1 1 0 0 
0 0 1 0 0 
0 0 1 1 0
0 0 1 0 1

从给出的二维矩阵,我们轻易得到2是名人
观察名人的行和列,即第三行和第三列
可以看到其所在行,除了自己其他位置皆为0——他不认识所有人
可以看到其所在列,全部位置皆为1——所有人都认识他

第一次候选是怎么将其挑出来的?
0为候选人
[1,0]0  表示1不认识0 跳列
1为候选人
[2,1]0  表示2不认识1 跳列
2为候选人
[3,2]1  表示3认识2
2为候选人
[4,2]1  表示4认识2
2为候选人

也就检测每列的下半部分 判断其全是否为1
上述过程并未判断到 0认识2  1认识2
所以挑选出来的候选人只是可能为名人
——————————————————————————————————————————————

例2
1 0 1 1 0 
0 1 1 1 0 
0 1 1 1 0 
0 0 0 1 0
0 1 1 1 1

1 0 1 1 0 
1 1 1 1 0 
0 1 1 1 0 
0 0 0 1 0
0 1 1 1 1

1 0 0 1 0 
1 1 1 1 0 
1 1 1 1 0 
0 0 0 1 0
0 1 1 1 1

第一次候选是怎么将其挑出来的?
从左上角开始 按行走(向下走) 遇到0就转弯(向右走)  ——因为j不认识他
可以看到名人的那一行,会开出一个很多0的道路,直到它本身 便停止下来

***
知道规律之后,其实也可以通过名人除本人,该行都为0进行寻找
从左上角开始 按列走(向右走) 遇到1就转弯(向下走 注意判断ij是否相等) ——因为i认识别人
可以看到名人的那一列,会开出一个很多1的道路,直到它本身 便停止下来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值