打卡:等式方程的可满足性

  • 说在开头
    • 读题
    • 思路
    • 实现
    • 自测
    • 提交
    • 标答

说在开头

要坚持刷题呀,坚持表达解题的思路,记录为了减少程序复杂度的每一点努力。
“说不定我一生涓滴意念,侥幸汇成河。”

读题

leetcode: 990. 等式方程的可满足性

描述:
给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。

测试用例:
输入:[“a==b”,“b!=a”]
输出:false
输出:[“b==a”,“a==b”]
输入:true
输入:[“a==b”,“b==c”,“a==c”]
输出:true
输入:[“a==b”,“b!=c”,“c==a”]
输出:false
输入:[“c==c”,“b==d”,“x!=z”]
输出:true

提示:
1 <= equations.length <= 500
equations[i].length == 4
equations[i][0] 和 equations[i][3] 是小写字母
equations[i][1] 要么是 ‘=’,要么是 ‘!’
equations[i][2] 是 ‘=’

乍一看题目,这是在考啥,完全没有思路啊。这个时候,打开题目的相关标签:并查集
emmm,得涨一波知识了。 并查集详解(超级简单有趣~~就学会了)
大佬给出详细的图解,理解起来很容易。

思路

1:区分 ==!=
2:将 == 左右的元素指向同一个元素
3:用 != 来判断左右的元素是否指向同一个元素

实现

 /*** @param equations* @return*/public boolean equationsPossible(String[] equations) {//将入参分组,==和!=List<String> equals = new ArrayList<>();List<String> notEquals = new ArrayList<>();for (String str : equations) {if (str.contains("!")) {notEquals.add(str);} else {equals.add(str);}}//key为自身,value为根元素Map<String, String> map = new HashMap<>();equals.forEach(e -> putInMap(e.substring(0, 1), e.substring(3, 4), map));//至此,所有的i==j均实现了i、j为key,value为同一个元素for (String str : notEquals) {String left = str.substring(0, 1);String right = str.substring(3, 4);//判断是否有相同的valueif(map.computeIfAbsent(left,v->left).equals(map.computeIfAbsent(right,v->right))){return false;}}return true;}/*** 将left,right设置到map中,value对应同一个根* @param left 等式左侧元素* @param right 等式右侧元素* @param map 存放并查集的map* @return*/public void putInMap(String left, String right, Map<String, String> map) {String leftValue = map.computeIfAbsent(left, v -> left);String rightValue = map.computeIfAbsent(right, v -> null);//若leftValue != rightValue,需要进行合并处理if (!leftValue.equals(rightValue)) {//将right对应的一系列k-v转为left的vif(rightValue!=null){map.keySet().forEach(e->{if(map.get(e).equals(rightValue)){map.put(e,leftValue);}});}else{map.put(right,leftValue);}}}

自测

提交


实惨,却是意料之中的结果,接下来就是对代码的优化了。

标答

public boolean equationsPossible(String[] equations) {int length = equations.length;//元素均是小写字母,故数组定长为26int[] parent = new int[26];for (int i = 0; i < 26; i++) {parent[i] = i;}//先处理==for (String str : equations) {if (str.charAt(1) == '=') {//由小写字母得到的思路:通过ascii增量将字母转为0~25数字,刚好对应int index1 = str.charAt(0) - 'a';int index2 = str.charAt(3) - 'a';union(parent, index1, index2);}}//再处理!=for (String str : equations) {if (str.charAt(1) == '!') {int index1 = str.charAt(0) - 'a';int index2 = str.charAt(3) - 'a';if (find(parent, index1) == find(parent, index2)) {return false;}}}return true;}/*** index2的掌门决定当index1的掌门的上级* @param parent* @param index1* @param index2*/public void union(int[] parent, int index1, int index2) {parent[find(parent, index1)] = find(parent, index2);}/*** 寻找掌门人* @param parent* @param index* @return*/public int find(int[] parent, int index) {//parent[index] == index 自我管理:视为掌门while (parent[index] != index) {//将index上级的上级更新为index的上级--压缩路径parent[index] = parent[parent[index]];//此时更新index的值,从上级的上级开始向上查index = parent[index];}return index;}

find方法在寻找掌门的过程中,将所有涉及的成员都指向了更上一级(注意,此处还未指向掌门)。
union方法绑定了两个元素之间的关系,find的过程中又将成员指向了更上一级。
影响理解的点:parent数组每find一次就优化一次,说不定最终也没优化到最理想的结果呢!

上述代码是我从 官方题解 里copy出来,自己做不到这么精简呀。

实在不知道该怎么程序化地描述方法在做啥,还好大佬贴子中有门派之说,借鉴过来就很好理解了。

每日打卡:等式方程的可满足性相关推荐

  1. leetcode990. 等式方程的可满足性

    leetcode990. 等式方程的可满足性 题目描述 链接: leetcode990. 给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采 ...

  2. 990. 等式方程的可满足性

    链接:990. 等式方程的可满足性 题解:https://www.yuque.com/liweiwei1419/algo/gq157y class Solution {public:vector< ...

  3. [Leedcode][JAVA][第990题][等式方程的可满足性][并查集]

    [问题描述][中等] 给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:"a==b" 或 &quo ...

  4. leetcode990. 等式方程的可满足性(并查集)

    给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:"a==b" 或 "a!=b" ...

  5. LeetCode 990. 等式方程的可满足性(并查集)

    1. 题目 给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:"a==b" 或 "a!= ...

  6. 从入门到入土:python爬虫|SCU每日打卡自动填写|测试训练|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  7. P1664 每日打卡心情好

    P1664 每日打卡心情好 提交29.87k 通过11.90k 时间限制1.00s 内存限制125.00MB 提交答案加入题单复制题目 做题计划(首页) 个人题单 团队题单 保存 选择团队 保存 题目 ...

  8. 学习笔记,每日打卡,持续更新

    文章更新于:2020-04-03 注:本贴用于学习备忘,持续更新. 每日打卡 一.就是一 1.1.2020-04-03 1.2.2020-04-04 1.3.2020-04-05 1.4.2020-0 ...

  9. matlab等式操作,matlab处理一个等式方程,急用,谢谢

    再次麻烦了 我的问题是: f=-v/2*sqrt(pi)*quad(t^(z^2-1/2)*(1+2*z^2*log(t))*exp(-v^2*z^2*t^(2*z^2)),t,0,1)=0:这是我的 ...

  10. 2021-11-01 每日打卡:腾讯精选50题

    2021-11-01 每日打卡:腾讯精选50题 写在前面 "这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情.专注,决定了在 ...

最新文章

  1. 第52章,bitmap图像处理(从零开始学android),第52章、Bitmap图像处理(从零开始学Android)...
  2. linux系统内核文百科,Linux之内核中的文件系统 -电脑资料
  3. c#_textbox显示刷新规定行数的数据
  4. [LeetCode]--38. Count and Say
  5. linux 线程流水线,linux线程同步
  6. 函数的嵌套调用-函数嵌套调用的执行线路图
  7. 多种方法实现自适应布局
  8. python2字符串编码方式_一、基础部分-2.字符串编码
  9. 100条常用写作谚语(1)(2)(3)(4)
  10. 5年赚50倍的段永平:这几家公司正在长长的坡上滚着厚厚的雪
  11. python 爬虫生成csv文件和图_python爬虫系列(4.2-python操作csv文件)
  12. bgp 建立邻居发送的报文_HCIE笔记-------BGP邻居状态详解
  13. .NET 调整图片尺寸(Resize)各种方法
  14. 2018年的好书基本都在这了,你一共读过几本?
  15. python模拟鼠标操作_python 捕捉和模拟鼠标键盘操作
  16. 常见排序算法原理及java实现
  17. 安装Chrome插件-ChroPath
  18. ubuntu 黑体_Ubuntu 黑体解决方案
  19. Android获取根目录
  20. 计算机网络里不显示共享打印机驱动,win10连接共享打印机时“找不到驱动程序”怎么回事...

热门文章

  1. 运行时 Entry name .... .. collided
  2. 蓝桥杯单片机(十一)PCF8591(A/D转换)
  3. strongswan与sangfor的ikev2配置
  4. 常见的平均查找长度总结
  5. 【深度学习之美】一入侯门“深”似海,深度学习深几许(入门系列之一)
  6. 最全的熬粥方法Word计算机考试怎么做,煮粥方法大全(珍藏版)
  7. python入门经典书书籍-python入门到进阶书籍推荐!16本经典python书籍
  8. nginx—动静分离
  9. win10电脑锁屏快捷键
  10. 单元测试总结反思_考试反思,考试反思作文