年轻即出发...
简书:https://www.jianshu.com/u/7110a2ba6f9e
知乎:https://www.zhihu.com/people/zqtao23/posts
GitHub源码:https://github.com/zqtao2332
个人网站:http://www.zqtaotao.cn/ (停止维护更新内容)
QQ交流群:606939954
咆哮怪兽一枚...嗷嗷嗷...趁你现在还有时间,尽你自己最大的努力。努力做成你最想做的那件事,成为你最想成为的那种人,过着你最想过的那种生活。也许我们始终都只是一个小人物,但这并不妨碍我们选择用什么样的方式活下去,这个世界永远比你想的要更精彩。
最后:喜欢编程,对生活充满激情
本节内容预告
实例1:岛问题和并查集
实例2:并查集应用-二叉树任意两节点寻找最近祖先
实例3:子矩阵最大累加和
实例1:岛问题和并查集
岛问题和并查集的基本知识,已经在简书中记录过。
原文:https://www.jianshu.com/p/98ceadaf039a
实例2:并查集应用-二叉树任意两节点寻找最近祖先
如下的Node类是标准的二叉树节点结构:
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
再定义Query类如下:
public static class Query {
public Node o1;
public Node o2;
public Query(Node o1, Node o2) {
this.o1 = o1;
this.o2 = o2;
}
}
一个Query类的实例表示一条查询语句,表示想要查询01节点和02节点的最近公共祖先节点.
给定一棵二叉树的头节点head,并给定所有的查询语句,即一个Query类型的数组 Queryl ques,
请返回Node类型的数组Node[] ans,
ans[j]代表ques[j]这条查询的答案,即 ques[i].01和ques[j].02的最近公共祖先
【要求】
如果二叉树的节点数为N,查询语句的条数为M,整个处理过程的时间复杂度要求达到O(N+M).
1、将所有的请求都存储进哈希表,同时存储进每一个请求的反请求。
另外一个indexMap 来存储请求和反请求对应的是第几个请求
一个请求 (4,9)
同时在哈希表中存进这个请求和反请求
(4,9) (9,4)
再看indexMap
假设有:(2,3) (5,1) (4,9) (7,2)
只有是同一个请求,无论是反请求还是原请求,都记录相同的index,如(4,9) ,存的都是2号请求。
这是一个二叉树,当遍历大4 的时候,9还未出现,那么就暂时放弃(4,9)请求,等遍历到9时进行(9,4)的请求。
2、排除一些可以直接给定查询答案的query
if (o1 == o2 || o1 == null || o2 == null) {
ans[i] = o1 != null ? o1 : o2;
}
query的o1 或者 o2 为空,或者都为空处理
3、并查集处理祖先
![6d403724a2f95a010afd3e562a55c308.png](https://i-blog.csdnimg.cn/blog_migrate/123a73a95d5c29e3f928369e4cf3761c.jpeg)
import java.util.HashMap;
import java.util.LinkedList;
/**
* @description: 并查集应用-二叉树任意两个节点寻找最近祖先
*/
public class Code_08_TarjanAndUnionSet