Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /