C++力扣:省份数量 | 等式方程的可满足性


省份数量

题目剑指 Offer II 116. 省份数量

在这里插入图片描述

示例

在这里插入图片描述

解答

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值