省份数量
示例
解答
class Solution {
public:
int findCircleNum(vector<vector<int>>& isConnected)
{
// 手动控制并查集
vector<int> ufs(isConnected.size(), -1);
// 查找根
auto findRoot = [&ufs](int x)
{
while(ufs[x] >= 0)
x = ufs[x];
return x;
};
for(size_t i = 0; i < isConnected.size(); ++i)
{
for(size_t j = 0; j < isConnected[i].size(); ++j)
{
if(isConnected[i][j] == 1)
{
// 合并集合
int root1 = findRoot(i);
int root2 = findRoot(j);
if(root1 != root2)
{
ufs[root1] += ufs[root2];
ufs[root2] = root1;
}
}
}
}
int n = 0;
for(auto e : ufs)
{
if(e < 0)
++n;
}
return n;
}
};
等式方程的可满足性
题目990力扣
示例
解答
- 解题思路:
- 将所有"=="两端的字符合并到一个集合中
- 检测"!=" 两端的字符是否在同一个结合中,如果在不满足,如果不在满足
class Solution {
public:
bool equationsPossible(vector<string>& equations) {
vector<int> ufs(26,-1);
auto find_root = [&ufs](int x)
{
while(ufs[x]>=0)
x=ufs[x];
};
for(auto& str : equations)
{
if(str[1]=='=')
{
int root1 = find_root(str[0]-'a');//字母映射后的数组下标
int root2 = find_root(str[2]-'a');
if(root1 != root2)//不在一个集合里就合并
{
ufs[root1] += ufs[root2];
ufs[root2] = root1;
}
}
}
for(auto& str : equations)
{
if(str[1]=='!')
{
int root1 = find_root(str[0]-'a');
int root2 = find_root(str[2]-'a');
if(root1 == root2)//相悖
{
return false;
}
}
}
return true;
}
};