Skip to content

Commit 3fce2e5

Browse files
committed
feat: add solutions to lc problem: No.1562
No.1562.Find Latest Group of Size M
1 parent 34426a2 commit 3fce2e5

File tree

7 files changed

+600
-14
lines changed

7 files changed

+600
-14
lines changed

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

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,22 +69,298 @@
6969

7070
<!-- 这里可写通用的实现逻辑 -->
7171

72+
**方法一:并查集**
73+
74+
正向遍历 $arr$,利用并查集动态维护每组 $1$ 的长度。
75+
76+
时间复杂度 $O(nlogn)$。
77+
78+
类似题目:[2334. 元素值大于变化阈值的子数组](/solution/2300-2399/2334.Subarray%20With%20Elements%20Greater%20Than%20Varying%20Threshold/README.md)
79+
80+
**方法二:动态维护区间端点的长度**
81+
82+
我们其实并不需要去通过查找并查集来获取每个区间长度,我们只需要在每个区间端点处记录每个区间长度,由于合并的时候**只会访问区间端点**,所以合并区间的时候修改端点区间长度即可。
83+
84+
时间复杂度 $O(n)$。
85+
7286
<!-- tabs:start -->
7387

7488
### **Python3**
7589

7690
<!-- 这里可写当前语言的特殊实现逻辑 -->
7791

7892
```python
93+
class Solution:
94+
def findLatestStep(self, arr: List[int], m: int) -> int:
95+
def find(x):
96+
if p[x] != x:
97+
p[x] = find(p[x])
98+
return p[x]
99+
100+
def union(a, b):
101+
pa, pb = find(a), find(b)
102+
if pa == pb:
103+
return
104+
p[pa] = pb
105+
size[pb] += size[pa]
106+
107+
n = len(arr)
108+
if m == n:
109+
return n
110+
vis = [False] * n
111+
p = list(range(n))
112+
size = [1] * n
113+
ans = -1
114+
for i, v in enumerate(arr):
115+
v -= 1
116+
if v and vis[v - 1]:
117+
if size[find(v - 1)] == m:
118+
ans = i
119+
union(v, v - 1)
120+
if v < n - 1 and vis[v + 1]:
121+
if size[find(v + 1)] == m:
122+
ans = i
123+
union(v, v + 1)
124+
vis[v] = True
125+
return ans
126+
```
79127

128+
```python
129+
class Solution:
130+
def findLatestStep(self, arr: List[int], m: int) -> int:
131+
n = len(arr)
132+
if m == n:
133+
return n
134+
cnt = [0] * (n + 2)
135+
ans = -1
136+
for i, v in enumerate(arr):
137+
v -= 1
138+
l, r = cnt[v - 1], cnt[v + 1]
139+
if l == m or r == m:
140+
ans = i
141+
cnt[v - l] = cnt[v + r] = l + r + 1
142+
return ans
80143
```
81144

82145
### **Java**
83146

84147
<!-- 这里可写当前语言的特殊实现逻辑 -->
85148

86149
```java
150+
class Solution {
151+
private int[] p;
152+
private int[] size;
153+
154+
public int findLatestStep(int[] arr, int m) {
155+
int n = arr.length;
156+
if (m == n) {
157+
return n;
158+
}
159+
boolean[] vis = new boolean[n];
160+
p = new int[n];
161+
size = new int[n];
162+
for (int i = 0; i < n; ++i) {
163+
p[i] = i;
164+
size[i] = 1;
165+
}
166+
int ans = -1;
167+
for (int i = 0; i < n; ++i) {
168+
int v = arr[i] - 1;
169+
if (v > 0 && vis[v - 1]) {
170+
if (size[find(v - 1)] == m) {
171+
ans = i;
172+
}
173+
union(v, v - 1);
174+
}
175+
if (v < n - 1 && vis[v + 1]) {
176+
if (size[find(v + 1)] == m) {
177+
ans = i;
178+
}
179+
union(v, v + 1);
180+
}
181+
vis[v] = true;
182+
}
183+
return ans;
184+
}
185+
186+
private int find(int x) {
187+
if (p[x] != x) {
188+
p[x] = find(p[x]);
189+
}
190+
return p[x];
191+
}
192+
193+
private void union(int a, int b) {
194+
int pa = find(a), pb = find(b);
195+
if (pa == pb) {
196+
return;
197+
}
198+
p[pa] = pb;
199+
size[pb] += size[pa];
200+
}
201+
}
202+
```
203+
204+
```java
205+
class Solution {
206+
public int findLatestStep(int[] arr, int m) {
207+
int n = arr.length;
208+
if (m == n) {
209+
return n;
210+
}
211+
int[] cnt = new int[n + 2];
212+
int ans = -1;
213+
for (int i = 0; i < n; ++i) {
214+
int v = arr[i];
215+
int l = cnt[v - 1], r = cnt[v + 1];
216+
if (l == m || r == m) {
217+
ans = i;
218+
}
219+
cnt[v - l] = l + r + 1;
220+
cnt[v + r] = l + r + 1;
221+
}
222+
return ans;
223+
}
224+
}
225+
```
226+
227+
### **C++**
228+
229+
```cpp
230+
class Solution {
231+
public:
232+
vector<int> p;
233+
vector<int> size;
234+
235+
int findLatestStep(vector<int>& arr, int m) {
236+
int n = arr.size();
237+
if (m == n) return n;
238+
p.resize(n);
239+
size.assign(n, 1);
240+
for (int i = 0; i < n; ++i) p[i] = i;
241+
int ans = -1;
242+
vector<int> vis(n);
243+
for (int i = 0; i < n; ++i)
244+
{
245+
int v = arr[i] - 1;
246+
if (v && vis[v - 1])
247+
{
248+
if (size[find(v - 1)] == m) ans = i;
249+
unite(v, v - 1);
250+
}
251+
if (v < n - 1 && vis[v + 1])
252+
{
253+
if (size[find(v + 1)] == m) ans = i;
254+
unite(v, v + 1);
255+
}
256+
vis[v] = true;
257+
}
258+
return ans;
259+
}
260+
261+
int find(int x) {
262+
if (p[x] != x) p[x] = find(p[x]);
263+
return p[x];
264+
}
265+
266+
void unite(int a, int b) {
267+
int pa = find(a), pb = find(b);
268+
if (pa == pb) return;
269+
p[pa] = pb;
270+
size[pb] += size[pa];
271+
}
272+
};
273+
```
274+
275+
```cpp
276+
class Solution {
277+
public:
278+
int findLatestStep(vector<int>& arr, int m) {
279+
int n = arr.size();
280+
if (m == n) return n;
281+
vector<int> cnt(n + 2);
282+
int ans = -1;
283+
for (int i = 0; i < n; ++i)
284+
{
285+
int v = arr[i];
286+
int l = cnt[v - 1], r = cnt[v + 1];
287+
if (l == m || r == m) ans = i;
288+
cnt[v - l] = cnt[v + r] = l + r + 1;
289+
}
290+
return ans;
291+
}
292+
};
293+
```
294+
295+
### **Go**
296+
297+
```go
298+
func findLatestStep(arr []int, m int) int {
299+
n := len(arr)
300+
if m == n {
301+
return n
302+
}
303+
p := make([]int, n)
304+
size := make([]int, n)
305+
vis := make([]bool, n)
306+
for i := range p {
307+
p[i] = i
308+
size[i] = 1
309+
}
310+
var find func(int) int
311+
find = func(x int) int {
312+
if p[x] != x {
313+
p[x] = find(p[x])
314+
}
315+
return p[x]
316+
}
317+
union := func(a, b int) {
318+
pa, pb := find(a), find(b)
319+
if pa == pb {
320+
return
321+
}
322+
p[pa] = pb
323+
size[pb] += size[pa]
324+
}
325+
326+
ans := -1
327+
for i, v := range arr {
328+
v--
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+
}
345+
```
87346

347+
```go
348+
func findLatestStep(arr []int, m int) int {
349+
n := len(arr)
350+
if m == n {
351+
return n
352+
}
353+
cnt := make([]int, n+2)
354+
ans := -1
355+
for i, v := range arr {
356+
l, r := cnt[v-1], cnt[v+1]
357+
if l == m || r == m {
358+
ans = i
359+
}
360+
cnt[v-l], cnt[v+r] = l+r+1, l+r+1
361+
}
362+
return ans
363+
}
88364
```
89365

90366
### **...**

0 commit comments

Comments
 (0)