目录
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;
}
};