易知环的长度为两个点到他们最近公共祖先的长度之和再加一。所以这题即求任意两点的最近公共祖先。因为是满二叉树,所以我们每次向上一层查找,即把当前点除以2即可,直到找到他们的第一个公共祖先即可。
class Solution {
public:
vector<int> cycleLengthQueries(int n, vector<vector<int>>& q) {
int m=q.size();
vector<int> ans;
for(auto p:q){
int x=p[0],y=p[1];
int z=1;
while(x!=y){
if(x<y) swap(x,y);
x>>=1;
z++;
}
ans.push_back(z);
}
return ans;
}
};
时间复杂度:O(mlogn),m为queries数组的长度。
空间复杂度:O(1)。
本文介绍了如何利用满二叉树的特性,通过O(mlogn)的时间复杂度解决任意两点的最近公共祖先查询问题。核心算法是通过逐层向上查找,每层将点除以2,直到找到相同父节点,总结了查询过程并给出了Solution类的实现。
976

被折叠的 条评论
为什么被折叠?



