mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
Merge pull request #2557 from buaahjy/develop
1971:解决并查集路径压缩递归可能会造成栈溢出问题
This commit is contained in:
@ -38,11 +38,22 @@ void init() {
|
||||
father[i] = i;
|
||||
}
|
||||
}
|
||||
// 并查集里寻根的过程
|
||||
// 并查集里寻根的过程,这里递归调用当题目数据过多,递归调用可能会发生栈溢出
|
||||
|
||||
int find(int u) {
|
||||
return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩
|
||||
}
|
||||
|
||||
// 使用迭代的方法可以避免栈溢出问题
|
||||
int find(int x) {
|
||||
while (x != parent[x]) {
|
||||
// 路径压缩,直接将x链接到其祖先节点,减少树的高度
|
||||
parent[x] = parent[parent[x]];
|
||||
x = parent[x];
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
// 判断 u 和 v是否找到同一个根
|
||||
bool isSame(int u, int v) {
|
||||
u = find(u);
|
||||
@ -75,6 +86,8 @@ void join(int u, int v) {
|
||||
|
||||
此时我们就可以直接套用并查集模板。
|
||||
|
||||
本题在join函数调用find函数时如果是递归调用会发生栈溢出提示,建议使用迭代方法
|
||||
|
||||
使用 join(int u, int v)将每条边加入到并查集。
|
||||
|
||||
最后 isSame(int u, int v) 判断是否是同一个根 就可以了。
|
||||
@ -93,8 +106,13 @@ private:
|
||||
}
|
||||
}
|
||||
// 并查集里寻根的过程
|
||||
int find(int u) {
|
||||
return u == father[u] ? u : father[u] = find(father[u]);
|
||||
int find(int x) {
|
||||
while (x != parent[x]) {
|
||||
// 路径压缩,直接将x链接到其祖先节点,减少树的高度
|
||||
parent[x] = parent[parent[x]];
|
||||
x = parent[x];
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
// 判断 u 和 v是否找到同一个根
|
||||
|
Reference in New Issue
Block a user