Skip to content

Commit 17b5e16

Browse files
author
Jaran F
committed
feat: add JS solution to lc problem: No.1562
This time using 'Union' technique and also run through prettier on my codesandbox.io Cloud Development Environment
1 parent f2912ca commit 17b5e16

File tree

3 files changed

+144
-36
lines changed

3 files changed

+144
-36
lines changed

solution/1500-1599/1562.Find Latest Group of Size M/README.md

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -293,19 +293,55 @@ func findLatestStep(arr []int, m int) int {
293293

294294
```javascript
295295
const findLatestStep = function (arr, m) {
296-
let result = -1;
297-
const len = arr.length;
298-
const reOnes = new RegExp(`\\b1{${m}}\\b`);
299-
arr.reduce( (accum, item, iIndex) => {
300-
accum[item-1] = '1';
301-
iIndex++;
302-
if (iIndex >= m && reOnes.test(accum.join(''))) {
303-
result = iIndex;
296+
let p = [];
297+
let size = [];
298+
299+
function find(x) {
300+
if (p[x] !== x) {
301+
p[x] = find(p[x]);
304302
}
305-
return accum
306-
}, [...(" ".repeat(len))] );
307-
return result
308-
}
303+
return p[x];
304+
}
305+
306+
function union(a, b) {
307+
const pa = find(a);
308+
const pb = find(b);
309+
if (pa === pb) {
310+
return;
311+
}
312+
p[pa] = pb;
313+
size[pb] += size[pa];
314+
}
315+
316+
const n = arr.length;
317+
if (m === n) {
318+
return n;
319+
}
320+
const vis = new Array(n).fill(false);
321+
p = new Array(n);
322+
size = new Array(n).fill(1);
323+
for (let i = 0; i < n; ++i) {
324+
p[i] = i;
325+
}
326+
let ans = -1;
327+
for (let i = 0; i < n; ++i) {
328+
const v = arr[i] - 1;
329+
if (v > 0 && vis[v - 1]) {
330+
if (size[find(v - 1)] === m) {
331+
ans = i;
332+
}
333+
union(v, v - 1);
334+
}
335+
if (v < n - 1 && vis[v + 1]) {
336+
if (size[find(v + 1)] === m) {
337+
ans = i;
338+
}
339+
union(v, v + 1);
340+
}
341+
vis[v] = true;
342+
}
343+
return ans;
344+
};
309345
```
310346

311347
<!-- tabs:end -->

solution/1500-1599/1562.Find Latest Group of Size M/README_EN.md

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -273,19 +273,55 @@ func findLatestStep(arr []int, m int) int {
273273

274274
```javascript
275275
const findLatestStep = function (arr, m) {
276-
let result = -1;
277-
const len = arr.length;
278-
const reOnes = new RegExp(`\\b1{${m}}\\b`);
279-
arr.reduce( (accum, item, iIndex) => {
280-
accum[item-1] = '1';
281-
iIndex++;
282-
if (iIndex >= m && reOnes.test(accum.join(''))) {
283-
result = iIndex;
276+
let p = [];
277+
let size = [];
278+
279+
function find(x) {
280+
if (p[x] !== x) {
281+
p[x] = find(p[x]);
284282
}
285-
return accum
286-
}, [...(" ".repeat(len))] );
287-
return result
288-
}
283+
return p[x];
284+
}
285+
286+
function union(a, b) {
287+
const pa = find(a);
288+
const pb = find(b);
289+
if (pa === pb) {
290+
return;
291+
}
292+
p[pa] = pb;
293+
size[pb] += size[pa];
294+
}
295+
296+
const n = arr.length;
297+
if (m === n) {
298+
return n;
299+
}
300+
const vis = new Array(n).fill(false);
301+
p = new Array(n);
302+
size = new Array(n).fill(1);
303+
for (let i = 0; i < n; ++i) {
304+
p[i] = i;
305+
}
306+
let ans = -1;
307+
for (let i = 0; i < n; ++i) {
308+
const v = arr[i] - 1;
309+
if (v > 0 && vis[v - 1]) {
310+
if (size[find(v - 1)] === m) {
311+
ans = i;
312+
}
313+
union(v, v - 1);
314+
}
315+
if (v < n - 1 && vis[v + 1]) {
316+
if (size[find(v + 1)] === m) {
317+
ans = i;
318+
}
319+
union(v, v + 1);
320+
}
321+
vis[v] = true;
322+
}
323+
return ans;
324+
};
289325
```
290326

291327
<!-- tabs:end -->

solution/1500-1599/1562.Find Latest Group of Size M/Solution.js

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,52 @@
44
* @return {number}
55
*/
66
const findLatestStep = function (arr, m) {
7-
let result = -1;
8-
const len = arr.length;
9-
const reOnes = new RegExp(`\\b1{${m}}\\b`);
10-
arr.reduce( (accum, item, iIndex) => {
11-
accum[item-1] = '1';
12-
iIndex++;
13-
if (iIndex >= m && reOnes.test(accum.join(''))) {
14-
result = iIndex;
7+
let p = [];
8+
let size = [];
9+
10+
function find(x) {
11+
if (p[x] !== x) {
12+
p[x] = find(p[x]);
1513
}
16-
return accum
17-
}, [...(" ".repeat(len))] );
18-
return result
19-
}
14+
return p[x];
15+
}
16+
17+
function union(a, b) {
18+
const pa = find(a);
19+
const pb = find(b);
20+
if (pa === pb) {
21+
return;
22+
}
23+
p[pa] = pb;
24+
size[pb] += size[pa];
25+
}
26+
27+
const n = arr.length;
28+
if (m === n) {
29+
return n;
30+
}
31+
const vis = new Array(n).fill(false);
32+
p = new Array(n);
33+
size = new Array(n).fill(1);
34+
for (let i = 0; i < n; ++i) {
35+
p[i] = i;
36+
}
37+
let ans = -1;
38+
for (let i = 0; i < n; ++i) {
39+
const v = arr[i] - 1;
40+
if (v > 0 && vis[v - 1]) {
41+
if (size[find(v - 1)] === m) {
42+
ans = i;
43+
}
44+
union(v, v - 1);
45+
}
46+
if (v < n - 1 && vis[v + 1]) {
47+
if (size[find(v + 1)] === m) {
48+
ans = i;
49+
}
50+
union(v, v + 1);
51+
}
52+
vis[v] = true;
53+
}
54+
return ans;
55+
};

0 commit comments

Comments
 (0)