diff --git a/solution/1500-1599/1562.Find Latest Group of Size M/README.md b/solution/1500-1599/1562.Find Latest Group of Size M/README.md index ecbb32c70a1de..f21c095559df2 100644 --- a/solution/1500-1599/1562.Find Latest Group of Size M/README.md +++ b/solution/1500-1599/1562.Find Latest Group of Size M/README.md @@ -289,6 +289,55 @@ func findLatestStep(arr []int, m int) int { } ``` +#### JavaScript + +```js +const findLatestStep = function (arr, m) { + function find(x) { + if (p[x] !== x) { + p[x] = find(p[x]); + } + return p[x]; + } + + function union(a, b) { + const pa = find(a); + const pb = find(b); + if (pa === pb) { + return; + } + p[pa] = pb; + size[pb] += size[pa]; + } + + const n = arr.length; + if (m === n) { + return n; + } + const vis = Array(n).fill(false); + const p = Array.from({ length: n }, (_, i) => i); + const size = Array(n).fill(1); + let ans = -1; + for (let i = 0; i < n; ++i) { + const v = arr[i] - 1; + if (v > 0 && vis[v - 1]) { + if (size[find(v - 1)] === m) { + ans = i; + } + union(v, v - 1); + } + if (v < n - 1 && vis[v + 1]) { + if (size[find(v + 1)] === m) { + ans = i; + } + union(v, v + 1); + } + vis[v] = true; + } + return ans; +}; +``` + diff --git a/solution/1500-1599/1562.Find Latest Group of Size M/README_EN.md b/solution/1500-1599/1562.Find Latest Group of Size M/README_EN.md index 871c03a645257..66187e3f79854 100644 --- a/solution/1500-1599/1562.Find Latest Group of Size M/README_EN.md +++ b/solution/1500-1599/1562.Find Latest Group of Size M/README_EN.md @@ -269,6 +269,55 @@ func findLatestStep(arr []int, m int) int { } ``` +#### JavaScript + +```js +const findLatestStep = function (arr, m) { + function find(x) { + if (p[x] !== x) { + p[x] = find(p[x]); + } + return p[x]; + } + + function union(a, b) { + const pa = find(a); + const pb = find(b); + if (pa === pb) { + return; + } + p[pa] = pb; + size[pb] += size[pa]; + } + + const n = arr.length; + if (m === n) { + return n; + } + const vis = Array(n).fill(false); + const p = Array.from({ length: n }, (_, i) => i); + const size = Array(n).fill(1); + let ans = -1; + for (let i = 0; i < n; ++i) { + const v = arr[i] - 1; + if (v > 0 && vis[v - 1]) { + if (size[find(v - 1)] === m) { + ans = i; + } + union(v, v - 1); + } + if (v < n - 1 && vis[v + 1]) { + if (size[find(v + 1)] === m) { + ans = i; + } + union(v, v + 1); + } + vis[v] = true; + } + return ans; +}; +``` + diff --git a/solution/1500-1599/1562.Find Latest Group of Size M/Solution.js b/solution/1500-1599/1562.Find Latest Group of Size M/Solution.js new file mode 100644 index 0000000000000..9b6f3ddb4e12c --- /dev/null +++ b/solution/1500-1599/1562.Find Latest Group of Size M/Solution.js @@ -0,0 +1,44 @@ +const findLatestStep = function (arr, m) { + function find(x) { + if (p[x] !== x) { + p[x] = find(p[x]); + } + return p[x]; + } + + function union(a, b) { + const pa = find(a); + const pb = find(b); + if (pa === pb) { + return; + } + p[pa] = pb; + size[pb] += size[pa]; + } + + const n = arr.length; + if (m === n) { + return n; + } + const vis = Array(n).fill(false); + const p = Array.from({ length: n }, (_, i) => i); + const size = Array(n).fill(1); + let ans = -1; + for (let i = 0; i < n; ++i) { + const v = arr[i] - 1; + if (v > 0 && vis[v - 1]) { + if (size[find(v - 1)] === m) { + ans = i; + } + union(v, v - 1); + } + if (v < n - 1 && vis[v + 1]) { + if (size[find(v + 1)] === m) { + ans = i; + } + union(v, v + 1); + } + vis[v] = true; + } + return ans; +};