【LeetCode】并查集OJ

目录

1.省份数量 

2. 等式方程的可满足性


1.省份数量 

题目地址: 547. 省份数量 - 力扣(LeetCode)

解题思路:对于该题我们直接使用并查集,将可以直接的城市都归类一个集合,最后统计数组中集合的总数就是省份数了

解题代码:

class UnionFindSet//并查集
{
public:
	UnionFindSet(size_t n)//初始化数据
		:_ufs(n,-1)
	{}

	int FindRoot(int n)//查找元素的根节点
	{
		int parent = n;
		while (_ufs[parent] >= 0)
		{
			parent = _ufs[parent];
		}
		return parent;
	}

	void Union(int x, int y)//合并两个元素所在树
	{
		int root1 = FindRoot(x);
		int root2 = FindRoot(y);
		if (root1 == root2)//元素所在树都一样就没必要合并了
			return;
		if (root1 > root2)//取较小值的根节点来合并
			swap(root1, root2);
		_ufs[root1] += _ufs[root2];
		_ufs[root2] = root1;
	}

	size_t SetSize()//返回并查集中树的个数
	{
		size_t size = 0;
		for (auto e : _ufs)
		{
			if (e < 0)
				++size;
		}
		return size;
	}

private:
	vector<int> _ufs;
};

class Solution {
public:
    int findCircleNum(vector<vector<int>>& isConnected) {
        UnionFindSet ufs(isConnected.size());
        for(int i=0;i<isConnected.size();++i)
        {
            for(int j=0;j<isConnected[i].size();++j)
            {
                if(isConnected[i][j]==1)//如果两个城市直接连接,就合并两个城市所在集合
                {
                    ufs.Union(i,j);
                }
            }
        }
        return ufs.SetSize();//返回并查集中所有集合的个数
    }
};

2. 等式方程的可满足性

题目地址:990. 等式方程的可满足性 - 力扣(LeetCode)

解题思路:这题我们还是使用并查集的思路,由于该题最多只有26个字母所对应的数据,所以我们直接使用26个元素的vector来建立变量a-z的映射关系;我们先遍历一遍题目中所给关系,先将相等的变量都归类到一个集合中,之后再遍历一遍题目中所给关系,查找不相同的变量是否在一个集合中,如果有不相等的变量在同一个集合中就相悖了返回false即可

解题代码:

class UnionFindSet//并查集
{
public:
	UnionFindSet(size_t n)//初始化数据
		:_ufs(n,-1)
	{}

	int FindRoot(int n)//查找元素的根节点
	{
		int parent = n;
		while (_ufs[parent] >= 0)
		{
			parent = _ufs[parent];
		}
		return parent;
	}

	void Union(int x, int y)//合并两个元素所在树
	{
		int root1 = FindRoot(x);
		int root2 = FindRoot(y);
		if (root1 == root2)//元素所在树都一样就没必要合并了
			return;
		if (root1 > root2)//取较小值的根节点来合并
			swap(root1, root2);
		_ufs[root1] += _ufs[root2];
		_ufs[root2] = root1;
	}

	bool InSet(int x, int y)//判断两个元素是否在同一棵树
	{
		return FindRoot(x) == FindRoot(y);
	}

private:
	vector<int> _ufs;
};

class Solution {
public:
    bool equationsPossible(vector<string>& equations) {
        UnionFindSet ufs(26);//使用26个元素的vector代表字符变量a-z
        for(auto &e: equations)//遍历一遍所给关系,先将相等的变量都归类到一个集合中
        {
            if(e[1]=='=')
                ufs.Union(e[0]-'a',e[3]-'a');
        }
        for(auto &e: equations)//再遍历一遍题目中所给关系,查找不相同的变量是否在一个集合中
        {
            if(e[1]=='!'&&ufs.InSet(e[0]-'a',e[3]-'a'))
                return false;
        }
        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1e-12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值