Leetcode 1562. Find Latest Group of Size M 并查集+反向映射

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值