LeetCode 1562. 查找大小为M的最新分组
原题链接
简单
作者:
Lemmon_kk
,
2021-04-17 16:04:31
,
所有人可见
,
阅读 335
并查集维护一段连续的数字,然后有一个难点就是改一位该如何合并呢?
我们可以把所有数字向右边连边(相当于n+1是一个超级源点)
然后每次合并就可以
还有一个问题:如何判断是最后一次出现呢
我们每次更新完统计一下即可,开一个数组记录每个连续段的长度出现的次数
一直更新即可
const int N = 1e5 + 10;
int fa[N], sz[N], cnt[N];
int find(int x){
if(fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
class Solution {
public:
int findLatestStep(vector<int>& arr, int m) {
int n = arr.size();
for(int i = 1;i <= n + 1;i ++ ) sz[i] = 0, fa[i] = i, cnt[i] = 0;
cnt[0] = n + 1;
int res = -1;
for(int i = 0;i < arr.size();i ++ ){
int now = arr[i];
fa[now] = find(now + 1);
cnt[sz[now]] -- , cnt[sz[fa[now]]] -- ;
sz[fa[now]] += sz[now] + 1;
cnt[sz[fa[now]]] ++ ;
if(cnt[m] > 0) res = i + 1;
}
return res;
}
};