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