剑指 Offer II 116省份数量

Posted qnbk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer II 116省份数量相关的知识,希望对你有一定的参考价值。

省份数量

题目描述:


解题方法:并查集

class UnionFindSet

public:
	UnionFindSet(size_t n)
	
		_ufs.resize(n, -1);
	
	void Union(int x1, int x2)//x1和x2所在集合的合并
	
		assert(x1 < _ufs.size());
		assert(x2 < _ufs.size());
		int root1 = FindRoot(x1);
		int root2 = FindRoot(x2);
		
		//如果本身在一个集合就不用合并,不在一个集合需要合并
		if (root1 != root2)
		//合并
			_ufs[root1] += _ufs[root2];
			_ufs[root2] = root1;

		
	
	int FindRoot(int x)//查找x所在集合的根
	
		//双亲表示法:每个位置都存的是双亲的下标,根节点存的是负值
		assert(x < _ufs.size());

		while (_ufs[x] > 0)
		
			x = _ufs[x];
		
		return x;
	
    size_t SetSize()
    
        size_t n = 0;
        //有多少个集合
        for(size_t i = 0;i <_ufs.size();i++)
        
            if(_ufs[i] < 0)
            
                //有多少个根就有多少个集合
                n++;
            
        
        return n;
    
private:
	std::vector<int> _ufs;
;
class Solution 
public:
    int findCircleNum(vector<vector<int>>& isConnected) 
        UnionFindSet ufs(isConnected.size());
        for(size_t i = 0;i < isConnected.size();i++)
        
            for(size_t j = 0;j < isConnected.size();j++)
            
                if(isConnected[i][j] == 1)
                
                    //是相连城市
                    ufs.Union(i,j);//i,j合并
                
            
        
        return ufs.SetSize();

    
;

以上是关于剑指 Offer II 116省份数量的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode1074 / 560 / 1248 / 363 / 剑指 Offer 68 - II

0510-II173942555757-II64

剑指offer(59)-II

剑指offer59 - II 至 剑指offer 64 题解

剑指offer59 - II 至 剑指offer 64 题解

剑指offer--69 II 二叉树的最近公共祖先