Skip to content

Commit df12304

Browse files
authored
feat: add solutions to lc problem: No.3313 (doocs#3626)
No.3313.Find the Last Marked Nodes in Tree
1 parent 5a549bf commit df12304

File tree

4 files changed

+127
-18
lines changed

4 files changed

+127
-18
lines changed

solution/3300-3399/3313.Find the Last Marked Nodes in Tree/README.md

+44-6
Original file line numberDiff line numberDiff line change
@@ -216,17 +216,13 @@ public:
216216
g[u].push_back(v);
217217
g[v].push_back(u);
218218
}
219-
auto max_node = [&](const vector<int>& dist) {
220-
int mx = ranges::max(dist);
221-
return ranges::find(dist, mx) - dist.begin();
222-
};
223219
vector<int> dist1(n);
224220
dfs(0, -1, dist1);
225-
int a = max_node(dist1);
221+
int a = max_element(dist1.begin(), dist1.end()) - dist1.begin();
226222

227223
vector<int> dist2(n);
228224
dfs(a, -1, dist2);
229-
int b = max_node(dist2);
225+
int b = max_element(dist2.begin(), dist2.end()) - dist2.begin();
230226

231227
vector<int> dist3(n);
232228
dfs(b, -1, dist3);
@@ -342,6 +338,48 @@ function lastMarkedNodes(edges: number[][]): number[] {
342338
}
343339
```
344340

341+
#### JavaScript
342+
343+
```js
344+
/**
345+
* @param {number[][]} edges
346+
* @return {number[]}
347+
*/
348+
var lastMarkedNodes = function (edges) {
349+
const n = edges.length + 1;
350+
const g = Array.from({ length: n }, () => []);
351+
for (const [u, v] of edges) {
352+
g[u].push(v);
353+
g[v].push(u);
354+
}
355+
const dfs = (i, fa, dist) => {
356+
for (const j of g[i]) {
357+
if (j !== fa) {
358+
dist[j] = dist[i] + 1;
359+
dfs(j, i, dist);
360+
}
361+
}
362+
};
363+
364+
const dist1 = Array(n).fill(0);
365+
dfs(0, -1, dist1);
366+
const a = dist1.indexOf(Math.max(...dist1));
367+
368+
const dist2 = Array(n).fill(0);
369+
dfs(a, -1, dist2);
370+
const b = dist2.indexOf(Math.max(...dist2));
371+
372+
const dist3 = Array(n).fill(0);
373+
dfs(b, -1, dist3);
374+
375+
const ans = [];
376+
for (let i = 0; i < n; ++i) {
377+
ans.push(dist2[i] > dist3[i] ? a : b);
378+
}
379+
return ans;
380+
};
381+
```
382+
345383
<!-- tabs:end -->
346384

347385
<!-- solution:end -->

solution/3300-3399/3313.Find the Last Marked Nodes in Tree/README_EN.md

+44-6
Original file line numberDiff line numberDiff line change
@@ -216,17 +216,13 @@ public:
216216
g[u].push_back(v);
217217
g[v].push_back(u);
218218
}
219-
auto max_node = [&](const vector<int>& dist) {
220-
int mx = ranges::max(dist);
221-
return ranges::find(dist, mx) - dist.begin();
222-
};
223219
vector<int> dist1(n);
224220
dfs(0, -1, dist1);
225-
int a = max_node(dist1);
221+
int a = max_element(dist1.begin(), dist1.end()) - dist1.begin();
226222

227223
vector<int> dist2(n);
228224
dfs(a, -1, dist2);
229-
int b = max_node(dist2);
225+
int b = max_element(dist2.begin(), dist2.end()) - dist2.begin();
230226

231227
vector<int> dist3(n);
232228
dfs(b, -1, dist3);
@@ -342,6 +338,48 @@ function lastMarkedNodes(edges: number[][]): number[] {
342338
}
343339
```
344340

341+
#### JavaScript
342+
343+
```js
344+
/**
345+
* @param {number[][]} edges
346+
* @return {number[]}
347+
*/
348+
var lastMarkedNodes = function (edges) {
349+
const n = edges.length + 1;
350+
const g = Array.from({ length: n }, () => []);
351+
for (const [u, v] of edges) {
352+
g[u].push(v);
353+
g[v].push(u);
354+
}
355+
const dfs = (i, fa, dist) => {
356+
for (const j of g[i]) {
357+
if (j !== fa) {
358+
dist[j] = dist[i] + 1;
359+
dfs(j, i, dist);
360+
}
361+
}
362+
};
363+
364+
const dist1 = Array(n).fill(0);
365+
dfs(0, -1, dist1);
366+
const a = dist1.indexOf(Math.max(...dist1));
367+
368+
const dist2 = Array(n).fill(0);
369+
dfs(a, -1, dist2);
370+
const b = dist2.indexOf(Math.max(...dist2));
371+
372+
const dist3 = Array(n).fill(0);
373+
dfs(b, -1, dist3);
374+
375+
const ans = [];
376+
for (let i = 0; i < n; ++i) {
377+
ans.push(dist2[i] > dist3[i] ? a : b);
378+
}
379+
return ans;
380+
};
381+
```
382+
345383
<!-- tabs:end -->
346384

347385
<!-- solution:end -->

solution/3300-3399/3313.Find the Last Marked Nodes in Tree/Solution.cpp

+2-6
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,13 @@ class Solution {
88
g[u].push_back(v);
99
g[v].push_back(u);
1010
}
11-
auto max_node = [&](const vector<int>& dist) {
12-
int mx = ranges::max(dist);
13-
return ranges::find(dist, mx) - dist.begin();
14-
};
1511
vector<int> dist1(n);
1612
dfs(0, -1, dist1);
17-
int a = max_node(dist1);
13+
int a = max_element(dist1.begin(), dist1.end()) - dist1.begin();
1814

1915
vector<int> dist2(n);
2016
dfs(a, -1, dist2);
21-
int b = max_node(dist2);
17+
int b = max_element(dist2.begin(), dist2.end()) - dist2.begin();
2218

2319
vector<int> dist3(n);
2420
dfs(b, -1, dist3);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* @param {number[][]} edges
3+
* @return {number[]}
4+
*/
5+
var lastMarkedNodes = function (edges) {
6+
const n = edges.length + 1;
7+
const g = Array.from({ length: n }, () => []);
8+
for (const [u, v] of edges) {
9+
g[u].push(v);
10+
g[v].push(u);
11+
}
12+
const dfs = (i, fa, dist) => {
13+
for (const j of g[i]) {
14+
if (j !== fa) {
15+
dist[j] = dist[i] + 1;
16+
dfs(j, i, dist);
17+
}
18+
}
19+
};
20+
21+
const dist1 = Array(n).fill(0);
22+
dfs(0, -1, dist1);
23+
const a = dist1.indexOf(Math.max(...dist1));
24+
25+
const dist2 = Array(n).fill(0);
26+
dfs(a, -1, dist2);
27+
const b = dist2.indexOf(Math.max(...dist2));
28+
29+
const dist3 = Array(n).fill(0);
30+
dfs(b, -1, dist3);
31+
32+
const ans = [];
33+
for (let i = 0; i < n; ++i) {
34+
ans.push(dist2[i] > dist3[i] ? a : b);
35+
}
36+
return ans;
37+
};

0 commit comments

Comments
 (0)