File tree Expand file tree Collapse file tree 3 files changed +144
-36
lines changed
solution/1500-1599/1562.Find Latest Group of Size M Expand file tree Collapse file tree 3 files changed +144
-36
lines changed Original file line number Diff line number Diff line change @@ -293,19 +293,55 @@ func findLatestStep(arr []int, m int) int {
293
293
294
294
``` javascript
295
295
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]);
304
302
}
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
+ };
309
345
```
310
346
311
347
<!-- tabs:end -->
Original file line number Diff line number Diff line change @@ -273,19 +273,55 @@ func findLatestStep(arr []int, m int) int {
273
273
274
274
``` javascript
275
275
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]);
284
282
}
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
+ };
289
325
```
290
326
291
327
<!-- tabs:end -->
Original file line number Diff line number Diff line change 4
4
* @return {number }
5
5
*/
6
6
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 ] ) ;
15
13
}
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
+ } ;
You can’t perform that action at this time.
0 commit comments