lc 1483 树节点的第 K 个祖先(树上倍增、动态规划)

这篇具有很好参考价值的文章主要介绍了lc 1483 树节点的第 K 个祖先(树上倍增、动态规划)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

lc 1483 树节点的第 K 个祖先文章来源地址https://www.toymoban.com/news/detail-860974.html

  • 我们定义:节点的第 i 父节点为第 2 i 2^i 2i 父节点
  • 规律1:节点的第 n 个父节点 = 节点的第 n i n_i ni 个父节点的第 n j n_j nj 个父节点,其中 n i + n j = n n_i+n_j=n ni+nj=n
    • (倍增)二进制为基础,节点 i 的 第 2 j 2^j 2j 个父节点 = 节点 i 的第 2 j − 1 2^{j-1} 2j1 个父节点的第 2 j − 1 2^{j-1} 2j1 个父节点,即 a n c e s t o r s [ i ] [ j ] = a n c e s t o r s [ a n c e s t o r s [ i ] [ j − 1 ] ] [ j − 1 ] ancestors[i][j] = ancestors[ancestors[i][j - 1]][j - 1] ancestors[i][j]=ancestors[ancestors[i][j1]][j1](动态规划)
    • if (((k >> j) & 1) != 0) // 判断第 j 位是否为 1
      • 若是1
        • 有父节点 -> 往第 j 级父节点向上
        • 没有父节点 -> 原题无解
      • 若不是1,continued;
// 题解参考leetcode官方题解,gpt生成注释
class TreeAncestor {
    static final int LOG = 16; // 定义常量 LOG,表示每个节点的祖先个数上限。
    // 此题中,树最多有 50000 个节点,因此 ancestors的第二维度的最大值可以设为 16。
    int[][] ancestors; // 定义二维数组 ancestors,用于存储每个节点的祖先信息

    // 构造函数,初始化祖先数组
    public TreeAncestor(int n, int[] parent) {
        ancestors = new int[n][LOG]; // 初始化二维数组大小为 n * LOG
        for (int i = 0; i < n; i++) {
            Arrays.fill(ancestors[i], -1); // 将二维数组每个元素初始化为 -1,表示暂无祖先
        }
        for (int i = 0; i < n; i++) {
            ancestors[i][0] = parent[i]; // 初始化每个节点的一级祖先信息
        }
        // 填充祖先数组的其余级别信息
        for (int j = 1; j < LOG; j++) {
            for (int i = 0; i < n; i++) {
                if (ancestors[i][j - 1] != -1) { // 如果当前节点存在第 j - 1 级祖先
                    ancestors[i][j] = ancestors[ancestors[i][j - 1]][j - 1]; // 则当前节点的第 j 级祖先为其第 j - 1 级祖先的第 j - 1 级祖先
                }
            }
        }            
    }

    // 获取节点的第 k 个祖先
    public int getKthAncestor(int node, int k) {
        for (int j = 0; j < LOG; j++) {
            if (((k >> j) & 1) != 0) { // 判断第 j 位是否为 1
                node = ancestors[node][j]; // 更新当前节点为其第 j 级祖先
                if (node == -1) { // 若当前节点为空,则返回 -1
                    return -1;
                }
            }
        }
        return node; // 返回第 k 个祖先节点
    }
}

/**
 * Your TreeAncestor object will be instantiated and called as such:
 * TreeAncestor obj = new TreeAncestor(n, parent);
 * int param_1 = obj.getKthAncestor(node,k);
 */

到了这里,关于lc 1483 树节点的第 K 个祖先(树上倍增、动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 更快的求最近公共祖先(LCA)的算法-倍增法求LCA

    236. 二叉树的最近公共祖先 参考:最近公共祖先 f a [ i ] [ j ] rm{fa}[i][j] fa [ i ] [ j ] 表示结点 i i i 的第 2 i 2^i 2 i 个组先 d e p [ i ] rm{dep}[i] dep [ i ] 表示结点 i i i 的深度 n e x t [ i ] [ 0 ] rm{next}[i][0] next [ i ] [ 0 ] 表示结点 i i i 的左子结点 n e x t [ i ] [ 1 ] rm{next}[i][1] next [ i ] [ 1 ]

    2024年02月12日
    浏览(37)
  • 动态规划算法 - LC354. 俄罗斯套娃信封问题

    354. 俄罗斯套娃信封问题 困难 给你一个二维整数数组  envelopes  ,其中  envelopes[i] = [wi, hi]  ,表示第  i  个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算  最多能有多少个  信封

    2024年04月12日
    浏览(121)
  • 【每日一题Day208】LC1335工作计划的最低难度 | 动态规划

    工作计划的最低难度【LC1335】 你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 = j i )。 你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一天的难度之和,而一天的工作难度是当天应该完成工作的最大

    2024年02月05日
    浏览(70)
  • LC狂刷66道Dynamic-Programming算法题。跟动态规划说拜拜

    一种是从 (i-1, j) 这个位置走一步到达 一种是从(i, j - 1) 这个位置走一步到达 因为是计算所有可能的步骤,所以是把所有可能走的路径都加起来,所以关系式是 dp[i] [j] = dp[i-1] [j] + dp[i] [j-1]。 步骤三、找出初始值 显然,当 dp[i] [j] 中,如果 i 或者 j 有一个为 0,那么还能使用关

    2024年04月10日
    浏览(41)
  • 【每日一题 | 动态规划】访问完所有房间的第一天

    【动态规划】【数组】【2024-03-28】 1997. 访问完所有房间的第一天 定义状态 定义 f[i] 表示第一次到达房间 i 的日期编号。 根据题意,首次(第 1 次)访问房间 i 时,因为 1 是计数,所以下一次一定会访问房间 j = nextVisit[i] 。只有访问次数达到偶数才能访问右边的下一个房间

    2024年04月16日
    浏览(38)
  • LeetCode 1997.访问完所有房间的第一天:动态规划(DP)——4行主要代码(不需要什么前缀和)

    力扣题目链接:https://leetcode.cn/problems/first-day-where-you-have-been-in-all-the-rooms/ 你需要访问  n 个房间,房间从 0 到 n - 1 编号。同时,每一天都有一个日期编号,从 0 开始,依天数递增。你每天都会访问一个房间。 最开始的第 0 天,你访问  0 号房间。给你一个长度为 n 且 下标从

    2024年04月14日
    浏览(39)
  • 【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

    视频算法专题 动态规划汇总 广度优先搜索 状态压缩 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中,graph[i] 是一个列表,由所有与节点 i 直接相连的节点组成。 返回能够访问所有节点的最短路径的长度。你可

    2024年01月23日
    浏览(41)
  • LC-链表的中间节点(双指针)

    链接:https://leetcode.cn/problems/middle-of-the-linked-list/description/ 描述:给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 输入:head = [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点,值为 3 。 输入:head = [1,2,3,4,5,6

    2024年02月12日
    浏览(46)
  • 【每日一题Day220】LC1439有序矩阵中的第 k 个最小数组和 | 堆

    再来做一下373,之前都没有试过用小顶堆求第K小的,有序这个条件对我而言是摆设了 查找和最小的 K 对数字【LC373】 给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v) ,其中第一个元素来自 nums1 ,第二个元素来自 nums2 。 请找到和最小的 k

    2024年02月10日
    浏览(39)
  • 【LeetCode - 每日一题】1123. 最深叶节点的最近公共祖先(23.09.06)

    返回最深节点的最近公共祖先; 每个节点的 val 互不相同; 节点最多 1000 个; 和经典的 LCA 不同的是,这里的对象是 若干个叶节点(1个或多个,最深的) 。 首先将最深的叶节点找出来: bfs 广搜,用 map 存储每层的节点 记录所有节点的父节点: father 数组(在 bfs 广搜的同

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包