277. 搜寻名人

277. 搜寻名人

假设你是一个专业的狗仔,参加了一个 n 人派对,其中每个人被从 0n - 1 标号。在这个派对人群当中可能存在一位 “名人”。所谓 “名人” 的定义是:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。

现在你想要确认这个 “名人” 是谁,或者确定这里没有 “名人”。而你唯一能做的就是问诸如 “A 你好呀,请问你认不认识 B呀?” 的问题,以确定 A 是否认识 B。你需要在(渐近意义上)尽可能少的问题内来确定这位 “名人” 是谁(或者确定这里没有 “名人”)。

在本题中,你可以使用辅助函数 bool knows(a, b) 获取到 A 是否认识 B。

派对最多只会有一个 “名人” 参加。若 “名人” 存在,请返回他/她的编号;若 “名人” 不存在,请返回 -1

示例 1:

输入: graph = [
  [1,1,0],
  [0,1,0],
  [1,1,1]
]
输出: 1
解释: 有编号分别为 0、1 和 2 的三个人。graph[i][j] = 1 代表编号为 i 的人认识编号为 j 的人,而 graph[i][j] = 0 则代表编号为 i 的人不认识编号为 j 的人。“名人” 是编号 1 的人,因为 0 和 2 均认识他/她,但 1 不认识任何人。

解题

思路

根据题意:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。

可知 knows(a, b)

  • 返回 true 。则说明 a 不是名人,因为名人不认识其他人。
  • 返回 false 。则说明 b 不是名人,因为名人被所有人认识。

所以每一次询问总能排除一个人不是名人。

然后两两询问,总能排出一个非名人,询问 n - 1 次,只剩下 1 个人。

题意为最多 1 个名人,也就是需要核实最后剩下一个是否名人。

复杂度

时间复杂度: O ( N ) O(N) O(N)

空间复杂度: O ( 1 ) O(1) O(1)

代码

class Solution {
public:
    int findCelebrity(int n) {
        int res = 0;
        for (int i = 1; i < n; i++) { // 俩俩询问
            if (knows(res, i)) res = i;
        }

        for (int i = 0; i < n; i++) { // 最后核实
            if (i == res) continue;
            if (knows(res, i) || !knows(i, res)) return -1;
        }

        return res;
    }
};
好的,我可以帮你解决这个问题。首先,我们需要了解名人墙的基本结构和功能。一般来说,名人墙的主要功能是展示一系列名人的信息,包括他们的照片、姓名、职业、简介等。因此,我们可以从这些方面入手,设计出一个简单的名人墙。 下面是一个基本的HTML结构: ``` <!DOCTYPE html> <html> <head> <title>名人墙</title> <meta charset="UTF-8"> <style> /* CSS 样式 */ </style> </head> <body> <!-- 名人墙主体内容 --> <div class="celebrities"> <!-- 名人卡片 --> <div class="card"> <img src="img/xxx.jpg" alt="名人照片"> <h3>名人姓名</h3> <p>名人职业</p> <p>名人简介</p> </div> <!-- 可以添加更多名人卡片 --> </div> <script> // JavaScript 代码 </script> </body> </html> ``` 接下来,我们需要添加CSS样式,来美化名人墙的外观。这里只是提供一种基本的样式,你可以自己根据需要进行修改和调整。 ``` /* CSS 样式 */ .celebrities { display: flex; flex-wrap: wrap; margin: 0 auto; max-width: 800px; } .card { background-color: #fff; border-radius: 5px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); margin: 20px; overflow: hidden; width: calc(33.3% - 40px); transition: transform 0.3s ease-in-out; } .card:hover { transform: translateY(-5px); } .card img { display: block; height: 200px; object-fit: cover; width: 100%; } .card h3 { font-size: 24px; margin: 10px; } .card p { font-size: 18px; margin: 10px; } ``` 最后,我们需要添加JavaScript代码,来实现一些交互功能,比如点击卡片可以弹出详细信息等。这里只是提供一种基本的实现方式,你可以根据需要进行修改和调整。 ``` // JavaScript 代码 var cards = document.querySelectorAll('.card'); cards.forEach(function(card) { card.addEventListener('click', function() { alert('这是名人的详细信息'); }); }); ``` 这样,我们就完成了一个简单的名人墙。你可以根据需要进行添加和修改,比如增加搜索功能、分页功能等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值