Leetcode6268-查询树中环的长度

本文介绍了如何利用满二叉树的特性,通过O(mlogn)的时间复杂度解决任意两点的最近公共祖先查询问题。核心算法是通过逐层向上查找,每层将点除以2,直到找到相同父节点,总结了查询过程并给出了Solution类的实现。

易知环的长度为两个点到他们最近公共祖先的长度之和再加一。所以这题即求任意两点的最近公共祖先。因为是满二叉树,所以我们每次向上一层查找,即把当前点除以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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值