leetcode 990. Satisfiability of Equality Equations(等式方程的可满足性)

在这里插入图片描述
判断equations里面的条件是不是都满足。

思路:

Union Find
可以这样想,先通过"==“的等式把值相同的字母聚类,一个类别是一个值,
然后再通过”!="的不等式来验证值是不是有矛盾,有矛盾就返回false.

聚类(union):
首先根据"=="的等式建立union,
每个union有一个root,也就是说找到union里面任何一个点最终都会找到root。
每个点的root是它自己。

遍历"=="关系,当一条边右端点的root是它自己时,更新root为左端点。把左端点当作右端点的root。也可以反过来,把右端点当成root。
当右端点的root不是它自己时,说明它连接的有另一个节点,顺藤摸瓜一直摸到它的root。

验证(find):
union建立好之后,开始find
遍历"!="的不等式,找到左右两边点的root,它们的root相同时,发生矛盾,返回false

本来union的过程需要把点都连接到root上面,
比如:1->2->3->4, 要找4的root需要往上找好几层才能找到1,一般在union的过程中会把3,4直接连接到1.
这里做了简易union,2层2层往上连接,起了查找时间log2的作用。

总结一下,这种需要聚成几类后面方便验证或查找的,要想到union-find

public boolean equationsPossible(String[] equations) {
    int[] root = new int[26];
    for(int i = 0; i < 26; i++) {
        root[i] = i;
    }
    
    //先处理“==”
    for(String equ : equations) {
        if(equ.charAt(1) == '!') continue;
        int idx1 = equ.charAt(0) - 'a';
        int idx2 = equ.charAt(3) - 'a';
        //"=="左边的root定义为"=="右边的root
        root[find(root, idx1)] = find(root, idx2);
    }
    
    //处理"!="
    for(String equ : equations) {
        if(equ.charAt(1) == '=') continue;
        int idx1 = equ.charAt(0) - 'a';
        int idx2 = equ.charAt(3) - 'a';
        //"=="左边的root定义为"=="右边的root
        if(find(root, idx1) == find(root, idx2)) return false;
    }
    
    return true;
}

int find(int[] root, int idx) {
    int parent = idx;
    while(root[parent] != parent) {
        parent = root[parent];
        root[parent] = root[root[parent]];  //简易union
    }
    return parent;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝羽飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值