[杨小白]_leetcode_力扣_第 324 场周赛-第四题

107 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1984!!

力扣第 324 场周赛-力扣

第 324 场周赛

掉分啊!!! 打比赛的只有4000来人了

image.png

image.png

image.png

image.png

image.png

2509. 查询树中环的长度

给你一个整数 n ,表示你有一棵含有 2n - 1 个节点的 完全二叉树 。根节点的编号是 1 ,树中编号在[1, 2n - 1 - 1] 之间,编号为 val 的节点都有两个子节点,满足:

左子节点的编号为 2 * val 右子节点的编号为 2 * val + 1 给你一个长度为 m 的查询数组 queries ,它是一个二维整数数组,其中 queries[i] = [ai, bi] 。对于每个查询,求出以下问题的解:

在节点编号为 ai 和 bi 之间添加一条边。 求出图中环的长度。 删除节点编号为 ai 和 bi 之间新添加的边。 注意:

环 是开始和结束于同一节点的一条路径,路径中每条边都只会被访问一次。 环的长度是环中边的数目。 在树中添加额外的边后,两个点之间可能会有多条边。 请你返回一个长度为 m 的数组 answer ,其中 answer[i] 是第 i 个查询的结果。

示例1:

输入:n = 3, queries = [[5,3],[4,7],[2,3]]

输出:[4,5,3]

解释:上图是一棵有 23 - 1 个节点的树。红色节点表示添加额外边后形成环的节点。

  • 在节点 3 和节点 5 之间添加边后,环为 [5,2,1,3] ,所以第一个查询的结果是 4 。删掉添加的边后处理下一个查询。
  • 在节点 4 和节点 7 之间添加边后,环为 [4,2,1,3,7] ,所以第二个查询的结果是 5 。删掉添加的边后处理下一个查询。
  • 在节点 2 和节点 3 之间添加边后,环为 [2,1,3] ,所以第三个查询的结果是 3 。删掉添加的边。

示例 2:

输入:n = 2, queries = [[1,2]]

输出:[2]

解释:上图是一棵有 22 - 1 个节点的树。红色节点表示添加额外边后形成环的节点。

  • 在节点 1 和节点 2 之间添加边后,环为 [2,1] ,所以第一个查询的结果是 2 。删掉添加的边。

提示:

  • 2 <= n <= 30
  • m == queries.length
  • 1 <= m <= 105
  • queries[i].length == 2
  • 1 <= ai, bi <= 2n - 1
  • ai != bi

代码

暴力找公共点,谁大一些谁先往回跑,一样就结束。

第四题太简单了。

class Solution {
    public int[] cycleLengthQueries(int n, int[][] queries) {
        int[] res = new int[queries.length];
        for(int i = 0; i < queries.length; i++) {
            int a = queries[i][0];
            int b = queries[i][1];
            res[i] = lay(a, b);
        }
        return res;
    }
    public int lay(int a, int b) {
        int res = 0;
        while(a != b) {
            res++;
            if(a > b) {
                a = a / 2;
                
            } else {
                b = b / 2;
                
            }
        }
        return res + 1;
    }
}

3.结束

大早上爬起来掉分,第四题太简单了,第三题又一直考虑不充分,有几个过不了,掉分咯~ 今年上2000分有点难度。