Skip to content

Commit 52dd693

Browse files
committed
feat: add solutions to lc problem: No.0277
No.0277.Find the Celebrity
1 parent 4f95623 commit 52dd693

File tree

6 files changed

+295
-2
lines changed

6 files changed

+295
-2
lines changed

solution/0200-0299/0277.Find the Celebrity/README.md

+126-1
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,147 @@
6767

6868
<!-- 这里可写通用的实现逻辑 -->
6969

70+
**方法一:O(n) 遍历**
71+
72+
经过验证,若暴力遍历,调用 $O(n^2)$ 次 $knows$ 方法,会报 TLE 错误。因此,我们需要寻找更优的解法。
73+
74+
要找出 $n$ 个人中的名人,题目给我们的关键信息是:1. 名人不认识其他所有人;2. 其他所有人都认识名人。
75+
76+
那么,我们初始时假定名人 $ans=0$。然后在 $[1,n)$ 范围内遍历 $i$,若 $ans$ 认识 $i$,说明 $ans$ 不是我们要找的名人,此时我们可以直接将 $ans$ 更新为 $i$。
77+
78+
为什么呢?我们来举个实际的例子。
79+
80+
```bash
81+
ans = 0
82+
for i in [1,n) {
83+
if (ans knows i) {
84+
ans = i
85+
}
86+
}
87+
88+
ans = 0
89+
90+
ans not knows 1
91+
ans not knows 2
92+
ans knows 3
93+
ans = 3
94+
95+
ans not knows 4
96+
ans not knows 5
97+
ans not knows 6
98+
ans = 6
99+
```
100+
101+
$ans$ 认识 $3$,说明 $ans$ 不是名人($0$ 不是名人),那么名人会是 $1$ 或者 $2$ 吗?不会!因为若 $1$ 或者 $2$ 是名人,那么 $0$ 应该认识 $1$ 或者 $2$ 才对,与前面的例子冲突。因此,我们可以直接将 $ans$ 更新为 $i$。
102+
103+
我们找出 $ans$ 之后,接下来再遍历一遍,判断 $ans$ 是否满足名人的条件。若不满足,返回 $-1$。
104+
105+
否则遍历结束,返回 $ans$。
106+
70107
<!-- tabs:start -->
71108
72109
### **Python3**
73110
74111
<!-- 这里可写当前语言的特殊实现逻辑 -->
75112
76113
```python
77-
114+
# The knows API is already defined for you.
115+
# return a bool, whether a knows b
116+
# def knows(a: int, b: int) -> bool:
117+
118+
class Solution:
119+
def findCelebrity(self, n: int) -> int:
120+
ans = 0
121+
for i in range(1, n):
122+
if knows(ans, i):
123+
ans = i
124+
for i in range(n):
125+
if ans != i:
126+
if knows(ans, i) or not knows(i, ans):
127+
return -1
128+
return ans
78129
```
79130
80131
### **Java**
81132
82133
<!-- 这里可写当前语言的特殊实现逻辑 -->
83134
84135
```java
136+
/* The knows API is defined in the parent class Relation.
137+
boolean knows(int a, int b); */
138+
139+
public class Solution extends Relation {
140+
public int findCelebrity(int n) {
141+
int ans = 0;
142+
for (int i = 1; i < n; ++i) {
143+
if (knows(ans, i)) {
144+
ans = i;
145+
}
146+
}
147+
for (int i = 0; i < n; ++i) {
148+
if (ans != i) {
149+
if (knows(ans, i) || !knows(i, ans)) {
150+
return -1;
151+
}
152+
}
153+
}
154+
return ans;
155+
}
156+
}
157+
```
158+
159+
### **C++**
160+
161+
```cpp
162+
/* The knows API is defined for you.
163+
bool knows(int a, int b); */
164+
165+
class Solution {
166+
public:
167+
int findCelebrity(int n) {
168+
int ans = 0;
169+
for (int i = 1; i < n; ++i) {
170+
if (knows(ans, i)) {
171+
ans = i;
172+
}
173+
}
174+
for (int i = 0; i < n; ++i) {
175+
if (ans != i) {
176+
if (knows(ans, i) || !knows(i, ans)) {
177+
return -1;
178+
}
179+
}
180+
}
181+
return ans;
182+
}
183+
};
184+
```
85185
186+
### **Go**
187+
188+
```go
189+
/**
190+
* The knows API is already defined for you.
191+
* knows := func(a int, b int) bool
192+
*/
193+
func solution(knows func(a int, b int) bool) func(n int) int {
194+
return func(n int) int {
195+
ans := 0
196+
for i := 1; i < n; i++ {
197+
if knows(ans, i) {
198+
ans = i
199+
}
200+
}
201+
for i := 0; i < n; i++ {
202+
if ans != i {
203+
if knows(ans, i) || !knows(i, ans) {
204+
return -1
205+
}
206+
}
207+
}
208+
return ans
209+
}
210+
}
86211
```
87212
88213
### **...**

solution/0200-0299/0277.Find the Celebrity/README_EN.md

+89-1
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,101 @@
4949
### **Python3**
5050

5151
```python
52-
52+
# The knows API is already defined for you.
53+
# return a bool, whether a knows b
54+
# def knows(a: int, b: int) -> bool:
55+
56+
class Solution:
57+
def findCelebrity(self, n: int) -> int:
58+
ans = 0
59+
for i in range(1, n):
60+
if knows(ans, i):
61+
ans = i
62+
for i in range(n):
63+
if ans != i:
64+
if knows(ans, i) or not knows(i, ans):
65+
return -1
66+
return ans
5367
```
5468

5569
### **Java**
5670

5771
```java
72+
/* The knows API is defined in the parent class Relation.
73+
boolean knows(int a, int b); */
74+
75+
public class Solution extends Relation {
76+
public int findCelebrity(int n) {
77+
int ans = 0;
78+
for (int i = 1; i < n; ++i) {
79+
if (knows(ans, i)) {
80+
ans = i;
81+
}
82+
}
83+
for (int i = 0; i < n; ++i) {
84+
if (ans != i) {
85+
if (knows(ans, i) || !knows(i, ans)) {
86+
return -1;
87+
}
88+
}
89+
}
90+
return ans;
91+
}
92+
}
93+
```
94+
95+
### **C++**
96+
97+
```cpp
98+
/* The knows API is defined for you.
99+
bool knows(int a, int b); */
100+
101+
class Solution {
102+
public:
103+
int findCelebrity(int n) {
104+
int ans = 0;
105+
for (int i = 1; i < n; ++i) {
106+
if (knows(ans, i)) {
107+
ans = i;
108+
}
109+
}
110+
for (int i = 0; i < n; ++i) {
111+
if (ans != i) {
112+
if (knows(ans, i) || !knows(i, ans)) {
113+
return -1;
114+
}
115+
}
116+
}
117+
return ans;
118+
}
119+
};
120+
```
58121
122+
### **Go**
123+
124+
```go
125+
/**
126+
* The knows API is already defined for you.
127+
* knows := func(a int, b int) bool
128+
*/
129+
func solution(knows func(a int, b int) bool) func(n int) int {
130+
return func(n int) int {
131+
ans := 0
132+
for i := 1; i < n; i++ {
133+
if knows(ans, i) {
134+
ans = i
135+
}
136+
}
137+
for i := 0; i < n; i++ {
138+
if ans != i {
139+
if knows(ans, i) || !knows(i, ans) {
140+
return -1
141+
}
142+
}
143+
}
144+
return ans
145+
}
146+
}
59147
```
60148

61149
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/* The knows API is defined for you.
2+
bool knows(int a, int b); */
3+
4+
class Solution {
5+
public:
6+
int findCelebrity(int n) {
7+
int ans = 0;
8+
for (int i = 1; i < n; ++i) {
9+
if (knows(ans, i)) {
10+
ans = i;
11+
}
12+
}
13+
for (int i = 0; i < n; ++i) {
14+
if (ans != i) {
15+
if (knows(ans, i) || !knows(i, ans)) {
16+
return -1;
17+
}
18+
}
19+
}
20+
return ans;
21+
}
22+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* The knows API is already defined for you.
3+
* knows := func(a int, b int) bool
4+
*/
5+
func solution(knows func(a int, b int) bool) func(n int) int {
6+
return func(n int) int {
7+
ans := 0
8+
for i := 1; i < n; i++ {
9+
if knows(ans, i) {
10+
ans = i
11+
}
12+
}
13+
for i := 0; i < n; i++ {
14+
if ans != i {
15+
if knows(ans, i) || !knows(i, ans) {
16+
return -1
17+
}
18+
}
19+
}
20+
return ans
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/* The knows API is defined in the parent class Relation.
2+
boolean knows(int a, int b); */
3+
4+
public class Solution extends Relation {
5+
public int findCelebrity(int n) {
6+
int ans = 0;
7+
for (int i = 1; i < n; ++i) {
8+
if (knows(ans, i)) {
9+
ans = i;
10+
}
11+
}
12+
for (int i = 0; i < n; ++i) {
13+
if (ans != i) {
14+
if (knows(ans, i) || !knows(i, ans)) {
15+
return -1;
16+
}
17+
}
18+
}
19+
return ans;
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# The knows API is already defined for you.
2+
# return a bool, whether a knows b
3+
# def knows(a: int, b: int) -> bool:
4+
5+
class Solution:
6+
def findCelebrity(self, n: int) -> int:
7+
ans = 0
8+
for i in range(1, n):
9+
if knows(ans, i):
10+
ans = i
11+
for i in range(n):
12+
if ans != i:
13+
if knows(ans, i) or not knows(i, ans):
14+
return -1
15+
return ans

0 commit comments

Comments
 (0)