Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 126 additions & 1 deletion
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‎

Lines changed: 89 additions & 1 deletion
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
### **...**
Lines changed: 22 additions & 0 deletions
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+
};
Lines changed: 22 additions & 0 deletions
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+
}
Lines changed: 21 additions & 0 deletions
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+
}
Lines changed: 15 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /