class Solution {
public:
vector<int> parent,size,groupsizes; //parent, size是并查集常规操作, size存每个组的size,groupsizes[m]用来表示size为m的组有多少个相当于一个反向映射
int Find(int x) {
while(x!=parent[x]){
x = parent[x];
}
return x;
}
void Union(int x,int y)
{
int xset=Find(x),yset=Find(y);
if(xset!=yset)
{
groupsizes[size[xset]]--,groupsizes[size[yset]]--; // 两个组要合并了,所以原来对应size的组数都-1
size[xset]<size[yset]?parent[xset]=yset:parent[yset]=xset; //并查集的平衡优化
size[xset]=size[yset]=size[xset]+size[yset]; //新组的size
groupsizes[size[xset]]++; //新组对应的size的组数+1
}
}
int findLatestStep(vector<int>& arr, int m)
{
parent.resize(arr.size()+1);
for(int i=1;i<=arr.size();i++)
parent[i]=i;
vector<bool> visited(arr.size()+1,false);
size.resize(arr.size()+1,1);
groupsizes.resize(arr.size()+1,0);
int last=-1,step=1;
for(int &i:arr)
{
groupsizes[1]++; //新加进一个时,size为1的组数肯定+1
if(i+1<=arr.size()&&visited[i+1]) //visited[i+1]表示右侧的bit值为'1',后面visited[i-1]同
Union(i,i+1);
if(i-1>0&&visited[i-1])
Union(i,i-1);
visited[i]=true;
if(groupsizes[m])
last=step;
step++;
}
return last;
}
};
Leetcode 1562. Find Latest Group of Size M 并查集+反向映射
最新推荐文章于 2024-07-22 23:10:48 发布