Skip to content

Commit 3f43d00

Browse files
authored
feat: add solutions for lc No.3820 (#4992)
1 parent ff49981 commit 3f43d00

7 files changed

Lines changed: 714 additions & 8 deletions

File tree

solution/3800-3899/3820.Pythagorean Distance Nodes in a Tree/README.md

Lines changed: 243 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,32 +119,271 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3800-3899/3820.Py
119119

120120
<!-- solution:start -->
121121

122-
### 方法一
122+
### 方法一:BFS + 枚举
123+
124+
我们首先根据题目给定的边构建一个邻接表 $g$,其中 $g[u]$ 存储与节点 $u$ 相邻的所有节点。
125+
126+
接下来,我们定义一个函数 $\text{bfs}(i)$,用于计算从节点 $i$ 出发到其他所有节点的距离。我们使用一个队列来实现广度优先搜索(BFS),并维护一个距离数组 $\text{dist}$,其中 $\text{dist}[j]$ 表示节点 $i$ 到节点 $j$ 的距离。初始时,$\text{dist}[i] = 0$,其他节点的距离设为无穷大。在 BFS 过程中,我们不断更新距离数组,直到遍历完所有可达的节点。
127+
128+
调用 $\text{bfs}(x)$、$\text{bfs}(y)$ 和 $\text{bfs}(z)$ 分别计算从节点 $x$、$y$ 和 $z$ 出发到其他所有节点的距离,得到三个距离数组 $d_1$、$d_2$ 和 $d_3$。
129+
130+
最后,我们遍历所有节点 $u$,对于每个节点,取出其到 $x$、$y$ 和 $z$ 的距离 $a = d_1[u]$、$b = d_2[u]$ 和 $c = d_3[u]$。我们将这三个距离排序,并检查是否满足勾股定理条件:$a^2 + b^2 = c^2$。如果满足条件,则将答案加一。
131+
132+
时间复杂度 $O(n)$,空间复杂度 $O(n)$,其中 $n$ 为树的节点数。
123133

124134
<!-- tabs:start -->
125135

126136
#### Python3
127137

128138
```python
129-
139+
class Solution:
140+
def specialNodes(
141+
self, n: int, edges: List[List[int]], x: int, y: int, z: int
142+
) -> int:
143+
g = [[] for _ in range(n)]
144+
for u, v in edges:
145+
g[u].append(v)
146+
g[v].append(u)
147+
148+
def bfs(i: int) -> List[int]:
149+
q = deque([i])
150+
dist = [inf] * n
151+
dist[i] = 0
152+
while q:
153+
for _ in range(len(q)):
154+
u = q.popleft()
155+
for v in g[u]:
156+
if dist[v] > dist[u] + 1:
157+
dist[v] = dist[u] + 1
158+
q.append(v)
159+
return dist
160+
161+
d1 = bfs(x)
162+
d2 = bfs(y)
163+
d3 = bfs(z)
164+
ans = 0
165+
for a, b, c in zip(d1, d2, d3):
166+
s = a + b + c
167+
a, c = min(a, b, c), max(a, b, c)
168+
b = s - a - c
169+
if a * a + b * b == c * c:
170+
ans += 1
171+
return ans
130172
```
131173

132174
#### Java
133175

134176
```java
135-
177+
class Solution {
178+
private List<Integer>[] g;
179+
private int n;
180+
private final int inf = Integer.MAX_VALUE / 2;
181+
182+
public int specialNodes(int n, int[][] edges, int x, int y, int z) {
183+
this.n = n;
184+
g = new ArrayList[n];
185+
Arrays.setAll(g, k -> new ArrayList<>());
186+
for (int[] e : edges) {
187+
int u = e[0], v = e[1];
188+
g[u].add(v);
189+
g[v].add(u);
190+
}
191+
192+
int[] d1 = bfs(x);
193+
int[] d2 = bfs(y);
194+
int[] d3 = bfs(z);
195+
196+
int ans = 0;
197+
for (int i = 0; i < n; i++) {
198+
long[] a = new long[] {d1[i], d2[i], d3[i]};
199+
Arrays.sort(a);
200+
if (a[0] * a[0] + a[1] * a[1] == a[2] * a[2]) {
201+
++ans;
202+
}
203+
}
204+
return ans;
205+
}
206+
207+
private int[] bfs(int i) {
208+
int[] dist = new int[n];
209+
Arrays.fill(dist, inf);
210+
Deque<Integer> q = new ArrayDeque<>();
211+
dist[i] = 0;
212+
q.add(i);
213+
while (!q.isEmpty()) {
214+
for (int k = q.size(); k > 0; --k) {
215+
int u = q.poll();
216+
for (int v : g[u]) {
217+
if (dist[v] > dist[u] + 1) {
218+
dist[v] = dist[u] + 1;
219+
q.add(v);
220+
}
221+
}
222+
}
223+
}
224+
return dist;
225+
}
226+
}
136227
```
137228

138229
#### C++
139230

140231
```cpp
141-
232+
class Solution {
233+
private:
234+
vector<vector<int>> g;
235+
int n;
236+
const int inf = INT_MAX / 2;
237+
238+
vector<int> bfs(int i) {
239+
vector<int> dist(n, inf);
240+
queue<int> q;
241+
dist[i] = 0;
242+
q.push(i);
243+
while (!q.empty()) {
244+
for (int k = q.size(); k > 0; --k) {
245+
int u = q.front();
246+
q.pop();
247+
for (int v : g[u]) {
248+
if (dist[v] > dist[u] + 1) {
249+
dist[v] = dist[u] + 1;
250+
q.push(v);
251+
}
252+
}
253+
}
254+
}
255+
return dist;
256+
}
257+
258+
public:
259+
int specialNodes(int n, vector<vector<int>>& edges, int x, int y, int z) {
260+
this->n = n;
261+
g.assign(n, {});
262+
for (auto& e : edges) {
263+
int u = e[0], v = e[1];
264+
g[u].push_back(v);
265+
g[v].push_back(u);
266+
}
267+
268+
vector<int> d1 = bfs(x);
269+
vector<int> d2 = bfs(y);
270+
vector<int> d3 = bfs(z);
271+
272+
int ans = 0;
273+
for (int i = 0; i < n; ++i) {
274+
array<long long, 3> a = {
275+
(long long) d1[i],
276+
(long long) d2[i],
277+
(long long) d3[i]};
278+
sort(a.begin(), a.end());
279+
if (a[0] * a[0] + a[1] * a[1] == a[2] * a[2]) {
280+
++ans;
281+
}
282+
}
283+
return ans;
284+
}
285+
};
142286
```
143287
144288
#### Go
145289
146290
```go
291+
func specialNodes(n int, edges [][]int, x int, y int, z int) int {
292+
g := make([][]int, n)
293+
for _, e := range edges {
294+
u, v := e[0], e[1]
295+
g[u] = append(g[u], v)
296+
g[v] = append(g[v], u)
297+
}
298+
299+
const inf = int(1e9)
300+
301+
bfs := func(i int) []int {
302+
dist := make([]int, n)
303+
for k := 0; k < n; k++ {
304+
dist[k] = inf
305+
}
306+
q := make([]int, 0)
307+
dist[i] = 0
308+
q = append(q, i)
309+
for len(q) > 0 {
310+
sz := len(q)
311+
for ; sz > 0; sz-- {
312+
u := q[0]
313+
q = q[1:]
314+
for _, v := range g[u] {
315+
if dist[v] > dist[u]+1 {
316+
dist[v] = dist[u] + 1
317+
q = append(q, v)
318+
}
319+
}
320+
}
321+
}
322+
return dist
323+
}
324+
325+
d1 := bfs(x)
326+
d2 := bfs(y)
327+
d3 := bfs(z)
328+
329+
ans := 0
330+
for i := 0; i < n; i++ {
331+
a := []int{d1[i], d2[i], d3[i]}
332+
sort.Ints(a)
333+
x0, x1, x2 := int64(a[0]), int64(a[1]), int64(a[2])
334+
if x0*x0+x1*x1 == x2*x2 {
335+
ans++
336+
}
337+
}
338+
return ans
339+
}
340+
```
147341

342+
#### TypeScript
343+
344+
```ts
345+
function specialNodes(n: number, edges: number[][], x: number, y: number, z: number): number {
346+
const g: number[][] = Array.from({ length: n }, () => []);
347+
for (const [u, v] of edges) {
348+
g[u].push(v);
349+
g[v].push(u);
350+
}
351+
352+
const inf = 1e9;
353+
354+
const bfs = (i: number): number[] => {
355+
const dist = Array(n).fill(inf);
356+
let q: number[] = [i];
357+
dist[i] = 0;
358+
while (q.length) {
359+
const nq = [];
360+
for (const u of q) {
361+
for (const v of g[u]) {
362+
if (dist[v] > dist[u] + 1) {
363+
dist[v] = dist[u] + 1;
364+
nq.push(v);
365+
}
366+
}
367+
}
368+
q = nq;
369+
}
370+
return dist;
371+
};
372+
373+
const d1 = bfs(x);
374+
const d2 = bfs(y);
375+
const d3 = bfs(z);
376+
377+
let ans = 0;
378+
for (let i = 0; i < n; i++) {
379+
const a = [d1[i], d2[i], d3[i]];
380+
a.sort((p, q) => p - q);
381+
if (a[0] * a[0] + a[1] * a[1] === a[2] * a[2]) {
382+
ans++;
383+
}
384+
}
385+
return ans;
386+
}
148387
```
149388

150389
<!-- tabs:end -->

0 commit comments

Comments
 (0)