Skip to content

Commit e27dfd1

Browse files
committed
feat: add solutions to lc problem: No.2092
No.2092.Find All People With Secret
1 parent 7121def commit e27dfd1

File tree

6 files changed

+508
-2
lines changed

6 files changed

+508
-2
lines changed

solution/2000-2099/2092.Find All People With Secret/README.md

+173-1
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,194 @@
7171

7272
<!-- 这里可写通用的实现逻辑 -->
7373

74+
**方法一:BFS**
75+
7476
<!-- tabs:start -->
7577

7678
### **Python3**
7779

7880
<!-- 这里可写当前语言的特殊实现逻辑 -->
7981

8082
```python
81-
83+
class Solution:
84+
def findAllPeople(self, n: int, meetings: List[List[int]], firstPerson: int) -> List[int]:
85+
vis = [False] * n
86+
vis[0] = vis[firstPerson] = True
87+
meetings.sort(key=lambda x: x[2])
88+
i, m = 0, len(meetings)
89+
while i < m:
90+
j = i
91+
while j + 1 < m and meetings[j + 1][2] == meetings[i][2]:
92+
j += 1
93+
s = set()
94+
g = defaultdict(list)
95+
for x, y, _ in meetings[i: j + 1]:
96+
g[x].append(y)
97+
g[y].append(x)
98+
s.update([x, y])
99+
q = deque([u for u in s if vis[u]])
100+
while q:
101+
u = q.popleft()
102+
for v in g[u]:
103+
if not vis[v]:
104+
vis[v] = True
105+
q.append(v)
106+
i = j + 1
107+
return [i for i, v in enumerate(vis) if v]
82108
```
83109

84110
### **Java**
85111

86112
<!-- 这里可写当前语言的特殊实现逻辑 -->
87113

88114
```java
115+
class Solution {
116+
public List<Integer> findAllPeople(int n, int[][] meetings, int firstPerson) {
117+
boolean[] vis = new boolean[n];
118+
vis[0] = true;
119+
vis[firstPerson] = true;
120+
int m = meetings.length;
121+
Arrays.sort(meetings, Comparator.comparingInt(a -> a[2]));
122+
for (int i = 0; i < m;) {
123+
int j = i;
124+
for (; j + 1 < m && meetings[j + 1][2] == meetings[i][2]; ++j);
125+
Map<Integer, List<Integer>> g = new HashMap<>();
126+
Set<Integer> s = new HashSet<>();
127+
for (int k = i; k <= j; ++k) {
128+
int x = meetings[k][0], y = meetings[k][1];
129+
g.computeIfAbsent(x, key -> new ArrayList<>()).add(y);
130+
g.computeIfAbsent(y, key -> new ArrayList<>()).add(x);
131+
s.add(x);
132+
s.add(y);
133+
}
134+
Deque<Integer> q = new ArrayDeque<>();
135+
for (int u : s) {
136+
if (vis[u]) {
137+
q.offer(u);
138+
}
139+
}
140+
while (!q.isEmpty()) {
141+
int u = q.poll();
142+
for (int v : g.getOrDefault(u, Collections.emptyList())) {
143+
if (!vis[v]) {
144+
vis[v] = true;
145+
q.offer(v);
146+
}
147+
}
148+
}
149+
i = j + 1;
150+
}
151+
List<Integer> ans = new ArrayList<>();
152+
for (int i = 0; i < n; ++i) {
153+
if (vis[i]) {
154+
ans.add(i);
155+
}
156+
}
157+
return ans;
158+
}
159+
}
160+
```
89161

162+
### **C++**
163+
164+
```cpp
165+
class Solution {
166+
public:
167+
vector<int> findAllPeople(int n, vector<vector<int>>& meetings, int firstPerson) {
168+
vector<bool> vis(n);
169+
vis[0] = vis[firstPerson] = true;
170+
sort(meetings.begin(), meetings.end(), [&](const auto& x, const auto& y) {
171+
return x[2] < y[2];
172+
});
173+
for (int i = 0, m = meetings.size(); i < m;)
174+
{
175+
int j = i;
176+
for (; j + 1 < m && meetings[j + 1][2] == meetings[i][2]; ++j);
177+
unordered_map<int, vector<int>> g;
178+
unordered_set<int> s;
179+
for (int k = i; k <= j; ++k)
180+
{
181+
int x = meetings[k][0], y = meetings[k][1];
182+
g[x].push_back(y);
183+
g[y].push_back(x);
184+
s.insert(x);
185+
s.insert(y);
186+
}
187+
queue<int> q;
188+
for (int u : s)
189+
if (vis[u])
190+
q.push(u);
191+
while (!q.empty())
192+
{
193+
int u = q.front();
194+
q.pop();
195+
for (int v : g[u])
196+
{
197+
if (!vis[v])
198+
{
199+
vis[v] = true;
200+
q.push(v);
201+
}
202+
}
203+
}
204+
i = j + 1;
205+
}
206+
vector<int> ans;
207+
for (int i = 0; i < n; ++i)
208+
if (vis[i])
209+
ans.push_back(i);
210+
return ans;
211+
}
212+
};
213+
```
214+
215+
### **Go**
216+
217+
```go
218+
func findAllPeople(n int, meetings [][]int, firstPerson int) []int {
219+
vis := make([]bool, n)
220+
vis[0], vis[firstPerson] = true, true
221+
sort.Slice(meetings, func(i, j int) bool {
222+
return meetings[i][2] < meetings[j][2]
223+
})
224+
for i, j, m := 0, 0, len(meetings); i < m; i = j + 1 {
225+
j = i
226+
for j+1 < m && meetings[j+1][2] == meetings[i][2] {
227+
j++
228+
}
229+
g := map[int][]int{}
230+
s := map[int]bool{}
231+
for _, e := range meetings[i : j+1] {
232+
x, y := e[0], e[1]
233+
g[x] = append(g[x], y)
234+
g[y] = append(g[y], x)
235+
s[x], s[y] = true, true
236+
}
237+
q := []int{}
238+
for u := range s {
239+
if vis[u] {
240+
q = append(q, u)
241+
}
242+
}
243+
for len(q) > 0 {
244+
u := q[0]
245+
q = q[1:]
246+
for _, v := range g[u] {
247+
if !vis[v] {
248+
vis[v] = true
249+
q = append(q, v)
250+
}
251+
}
252+
}
253+
}
254+
var ans []int
255+
for i, v := range vis {
256+
if v {
257+
ans = append(ans, i)
258+
}
259+
}
260+
return ans
261+
}
90262
```
91263

92264
### **TypeScript**

solution/2000-2099/2092.Find All People With Secret/README_EN.md

+173-1
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,190 @@ Thus, people 0, 1, 2, 3, and 4 know the secret after all the meetings.
6666

6767
## Solutions
6868

69+
BFS.
70+
6971
<!-- tabs:start -->
7072

7173
### **Python3**
7274

7375
```python
74-
76+
class Solution:
77+
def findAllPeople(self, n: int, meetings: List[List[int]], firstPerson: int) -> List[int]:
78+
vis = [False] * n
79+
vis[0] = vis[firstPerson] = True
80+
meetings.sort(key=lambda x: x[2])
81+
i, m = 0, len(meetings)
82+
while i < m:
83+
j = i
84+
while j + 1 < m and meetings[j + 1][2] == meetings[i][2]:
85+
j += 1
86+
s = set()
87+
g = defaultdict(list)
88+
for x, y, _ in meetings[i: j + 1]:
89+
g[x].append(y)
90+
g[y].append(x)
91+
s.update([x, y])
92+
q = deque([u for u in s if vis[u]])
93+
while q:
94+
u = q.popleft()
95+
for v in g[u]:
96+
if not vis[v]:
97+
vis[v] = True
98+
q.append(v)
99+
i = j + 1
100+
return [i for i, v in enumerate(vis) if v]
75101
```
76102

77103
### **Java**
78104

79105
```java
106+
class Solution {
107+
public List<Integer> findAllPeople(int n, int[][] meetings, int firstPerson) {
108+
boolean[] vis = new boolean[n];
109+
vis[0] = true;
110+
vis[firstPerson] = true;
111+
int m = meetings.length;
112+
Arrays.sort(meetings, Comparator.comparingInt(a -> a[2]));
113+
for (int i = 0; i < m;) {
114+
int j = i;
115+
for (; j + 1 < m && meetings[j + 1][2] == meetings[i][2]; ++j);
116+
Map<Integer, List<Integer>> g = new HashMap<>();
117+
Set<Integer> s = new HashSet<>();
118+
for (int k = i; k <= j; ++k) {
119+
int x = meetings[k][0], y = meetings[k][1];
120+
g.computeIfAbsent(x, key -> new ArrayList<>()).add(y);
121+
g.computeIfAbsent(y, key -> new ArrayList<>()).add(x);
122+
s.add(x);
123+
s.add(y);
124+
}
125+
Deque<Integer> q = new ArrayDeque<>();
126+
for (int u : s) {
127+
if (vis[u]) {
128+
q.offer(u);
129+
}
130+
}
131+
while (!q.isEmpty()) {
132+
int u = q.poll();
133+
for (int v : g.getOrDefault(u, Collections.emptyList())) {
134+
if (!vis[v]) {
135+
vis[v] = true;
136+
q.offer(v);
137+
}
138+
}
139+
}
140+
i = j + 1;
141+
}
142+
List<Integer> ans = new ArrayList<>();
143+
for (int i = 0; i < n; ++i) {
144+
if (vis[i]) {
145+
ans.add(i);
146+
}
147+
}
148+
return ans;
149+
}
150+
}
151+
```
152+
153+
### **C++**
154+
155+
```cpp
156+
class Solution {
157+
public:
158+
vector<int> findAllPeople(int n, vector<vector<int>>& meetings, int firstPerson) {
159+
vector<bool> vis(n);
160+
vis[0] = vis[firstPerson] = true;
161+
sort(meetings.begin(), meetings.end(), [&](const auto& x, const auto& y) {
162+
return x[2] < y[2];
163+
});
164+
for (int i = 0, m = meetings.size(); i < m;)
165+
{
166+
int j = i;
167+
for (; j + 1 < m && meetings[j + 1][2] == meetings[i][2]; ++j);
168+
unordered_map<int, vector<int>> g;
169+
unordered_set<int> s;
170+
for (int k = i; k <= j; ++k)
171+
{
172+
int x = meetings[k][0], y = meetings[k][1];
173+
g[x].push_back(y);
174+
g[y].push_back(x);
175+
s.insert(x);
176+
s.insert(y);
177+
}
178+
queue<int> q;
179+
for (int u : s)
180+
if (vis[u])
181+
q.push(u);
182+
while (!q.empty())
183+
{
184+
int u = q.front();
185+
q.pop();
186+
for (int v : g[u])
187+
{
188+
if (!vis[v])
189+
{
190+
vis[v] = true;
191+
q.push(v);
192+
}
193+
}
194+
}
195+
i = j + 1;
196+
}
197+
vector<int> ans;
198+
for (int i = 0; i < n; ++i)
199+
if (vis[i])
200+
ans.push_back(i);
201+
return ans;
202+
}
203+
};
204+
```
80205
206+
### **Go**
207+
208+
```go
209+
func findAllPeople(n int, meetings [][]int, firstPerson int) []int {
210+
vis := make([]bool, n)
211+
vis[0], vis[firstPerson] = true, true
212+
sort.Slice(meetings, func(i, j int) bool {
213+
return meetings[i][2] < meetings[j][2]
214+
})
215+
for i, j, m := 0, 0, len(meetings); i < m; i = j + 1 {
216+
j = i
217+
for j+1 < m && meetings[j+1][2] == meetings[i][2] {
218+
j++
219+
}
220+
g := map[int][]int{}
221+
s := map[int]bool{}
222+
for _, e := range meetings[i : j+1] {
223+
x, y := e[0], e[1]
224+
g[x] = append(g[x], y)
225+
g[y] = append(g[y], x)
226+
s[x], s[y] = true, true
227+
}
228+
q := []int{}
229+
for u := range s {
230+
if vis[u] {
231+
q = append(q, u)
232+
}
233+
}
234+
for len(q) > 0 {
235+
u := q[0]
236+
q = q[1:]
237+
for _, v := range g[u] {
238+
if !vis[v] {
239+
vis[v] = true
240+
q = append(q, v)
241+
}
242+
}
243+
}
244+
}
245+
var ans []int
246+
for i, v := range vis {
247+
if v {
248+
ans = append(ans, i)
249+
}
250+
}
251+
return ans
252+
}
81253
```
82254

83255
### **TypeScript**

0 commit comments

Comments
 (0)