2024.4.6力扣每日一题——树节点的第 K 个祖先

2024.4.6

      • 题目来源
      • 我的题解
        • 方法一 哈希表 超内存
        • 方法二 树上倍增

题目来源

力扣每日一题;题序:1483

我的题解

方法一 哈希表 超内存

使用一个哈希表存储每个节点的祖先节点。

时间复杂度:O(n)
空间复杂度:O( n 2 n^2 n2)

class TreeAncestor {Map<Integer,List<Integer>> res;int[] parent;int n;public TreeAncestor(int n, int[] parent) {this.n=n;this.parent=parent;res=new HashMap<>();computedAncestor(n,parent);}private void computedAncestor(int n,int[] parent){for(int i=1;i<n;i++){List<Integer> l=res.getOrDefault(i,new ArrayList<>());l.add(parent[i]);l.addAll(res.getOrDefault(parent[i],new ArrayList<>()));res.put(i,l);}}public int getKthAncestor(int node, int k) {List<Integer> t=res.getOrDefault(node,new ArrayList<>());return k<=t.size()?t.get(k-1):-1;// while(parent[node]!=-1){//     k--;//     node=parent[node];// }// return k!=-1?node:-1;}
}
方法二 树上倍增

倍增的思路类似于动态规划,定义 ancestors[i][j] 表示节点 i 的第 2 j 2^j 2j个祖先。此题中,树最多有 50000 个节点,因此 ancestors 的第二维度的最大值可以设为 16。根据定义,ancestors[i][0]=parent[i]。状态转移方程是 ancestors[i][j]=ancestors[ancestors[i][j−1]][j−1],即当前节点的第 2 j 2^j 2j个祖先,是他的第 2 j − 1 2^{j-1} 2j1 个祖先的第 2 j − 1 2^{j-1} 2j1 个祖先。当第 2 j 2^{j} 2j 个祖先不存在时,记为 −1。
查询时,需要将 k 的二进制表示从最低位到最高位依次进行判断,如果第 j 位为 1,则节点 node 需要进行转移到 ancestors[node][j],表示 node 向祖先方向移动了 2 j 2^{j} 2j 次。直至遍历完 k所有位或者 node 变为 −1。

时间复杂度:O(nlogn)
空间复杂度:O(nlogn)

class TreeAncestor {static final int LOG = 16;int[][] ancestors;public TreeAncestor(int n, int[] parent) {ancestors = new int[n][LOG];for (int i = 0; i < n; i++) {Arrays.fill(ancestors[i], -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) {ancestors[i][j] = ancestors[ancestors[i][j - 1]][j - 1];}}}            }public int getKthAncestor(int node, int k) {for (int j = 0; j < LOG; j++) {if (((k >> j) & 1) != 0) {node = ancestors[node][j];if (node == -1) {return -1;}}}return node;}
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/800222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hydra九头蛇

一、hydra简介 Hydra是一款非常强大的暴力破解工具&#xff0c;它是由著名的黑客组织THC开发的一款开源暴力破解工具。Hydra是一个验证性质的工具&#xff0c;主要目的是&#xff1a;展示安全研究人员从远程获取一个系统认证权限。 目前该工具支持以下协议的爆破&#xff1a; A…

2024年华为OD机试真题-启动多任务排序-Java-OD统一考试(C卷)

题目描述: 一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。 现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则…

蓝桥杯小白入门赛第9场第4题 字典树考试

问题描述 蓝桥学院最近教学了字典树这一数据结构,小蓝是全班的第一名,他不仅掌握了普通字典树,还自学了 01 字典树的使用。为了展示自己的能力,他向全班同学出了以下问题: 给定一个长度为 N N N 的数组 A A A , 你能否求出表达式 ∑ i = 1 N ∑ j = i + 1 N f ( A i …

【网站项目】农业信息管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

基于STM32f103芯片的应用程序在线升级功能框架的实现

目录 基于STM32f103芯片的应用程序在线升级功能框架的实现 一、原理简介 二、KEIL软件主要设置 三、应用程序app部分 四、Bootloader部分 五、补充部分 基于STM32f103芯片的应用程序在线升级功能框架的实现 一、原理简介 我们在使用stm32的过程中&#xff0c;如果需要对…

[C#]OpenCvSharp改变图像的对比度和亮度

目的 访问像素值mat.At<T>(y,x) 用0初始化矩阵Mat.Zeros 饱和操作SaturateCast.ToByte 亮度和对比度调整 g(x)αf(x)β 用α(>0)和β一般称作增益(gain)和偏置(bias)&#xff0c;分别控制对比度和亮度 把f(x)看成源图像像素&#xff0c;把g(x)看成输出图像像素…

Spring Boot集成Spring Retry快速入门Demo

1.Retry介绍 Spring Retry 提供了自动重新调用失败的操作的功能。这在错误可能是暂时的&#xff08;例如瞬时网络故障&#xff09;的情况下很有用。从2.2.0版本开始&#xff0c;重试功能已从Spring Batch中撤出&#xff0c;成为一个独立的新库&#xff1a;Spring Retry 使用场景…

蓝桥杯第十五届抱佛脚(十)贪心算法

蓝桥杯第十五届抱佛脚&#xff08;十&#xff09;贪心算法 贪心算法基本概念 贪心算法是一种在算法设计中常用的方法&#xff0c;它在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是最好或最优的算法。 贪…

身份证实名认证接口的价格一般是多少呢?基于PHP身份核验接口

身份证实名认证接口分为身份证二要素、三要素、三要素人像核验接口&#xff0c;被广泛的应用于婚恋、交友、电商等等一系列行业领域&#xff0c;身份证实名认证需要实时数据&#xff0c;对于数据源来说也需要可靠&#xff0c;那么&#xff0c;身份证实名认证的价格是不是很贵呢…

小小算式(1 + 2) * (3 + 4)背后的大道理

目录 前缀表示法&#xff08;波兰表达式&#xff09; 中缀表达法 后缀表达法&#xff08;逆波兰表达式&#xff09; 三种表达法的相互转换 练习&#xff1a;逆波兰表达式求值 前缀表示法&#xff08;波兰表达式&#xff09; 波兰表示法&#xff08;英语&#xff1a;Polis…

Python学习,记录不熟悉知识点

目录 Set&#xff08;集合&#xff09; 集合内置方法完整列表 根据字符串的表达式计算结果 ​编辑 条件控制&#xff1a; if – elif – else match...case 循环语句&#xff1a; while循环 for循环 在同一行中有多个赋值操作&#xff08;先计算&#xff0c;再赋值&…

【Vue】Vue3中的OptionsAPI与CompositionAPI

文章目录 OptionsAPICompositionAPI对比总结 OptionsAPI 中文名:选项式API通过定义methods,computed,watch,data等属性方法&#xff0c;处理页面逻辑。以下是OptionsAPI代码结构 实例代码: <script lang"ts">// js或者tsimport { defineComponent } from vu…

javaScript手写专题——防抖/节流/闭包/Promise/深浅拷贝

目录 目录 一、 防抖/节流/闭包/定时器 编写一个组件&#xff0c;在input中输入文本&#xff0c;在给定的数据中查找相关的项目&#xff0c;并渲染搜索结果列表 1.新增InputSearch.vue组件 key的作用 2.新增 InputView.vue 3.添加路由 4.效果演示 follow up加上防抖怎么处理 1.…

「51媒体网」邀请媒体采访报道对企业宣传有何意义?

传媒如春雨&#xff0c;润物细无声的&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体采访报道对企业宣传具有多重意义&#xff1a; 提升品牌知名度和曝光度&#xff1a;媒体是信息传播的重要渠道&#xff0c;通过媒体的报道&#xff0c;企业及其活动、产品能够迅…

软考信息处理技术员2024年5月报名流程及注意事项

2024年5月软考信息处理技术员报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息的…

k8s删除namespace失败一直处于Terminating状态

获取Terminating状态的namespace ~ kubectl get namespace NAME STATUS AGE bluehelix Active 146d broker Active 146d cattle-fleet-cluster…

Sketch是免费软件吗?这款软件支持导入!

Sketch 是一款针对网页、图标、插图等设计的矢量绘图软件。Sketch 的操作界面非常简单易懂&#xff0c;帮助全世界的设计师创作出许多不可思议的作品。但是同时&#xff0c;Sketch 也有一些痛点&#xff1a;使用 Sketch 需要安装 InVision、Abstract 、Zeplin 等插件&#xff0…

配置 施耐德 modbusTCP 分布式IO子站 PRA0100

模块官方介绍&#xff1a;https://www.schneider-electric.cn/zh/product/BMXPRA0100 1. 总体步骤 2. 软件组态&#xff1a;在 Unity Pro 软件中创建编辑 PRA 模块工程 2.1 新建项目 模块箱硬件型号如下 点击 Unity Pro 软件左上方【新建】按钮&#xff0c;选择正确的 DIO …

记一次C语言内存越界(内存越界 段错误 Segmentation fault )

1 背景 最近在用C重构原来用C写的SDK&#xff0c;发现一个内存越界问题&#xff0c;记录下来&#xff0c;以供后续参考。 2 问题 代码如下: #include <stdio.h> #include <stdlib.h>int array1[4] {1, 2, 3, 4}; int array2[4] {5, 6, 7, 8};int main(int arg…

Filter Listener Interceptor

文章目录 第一章 Filter1. 目标2. 内容讲解2.1 Filter的概念2.2 Filter的作用2.3 Filter的入门案例2.3.1 案例目标2.3.2 代码实现2.3.2.1 创建ServletDemo012.3.2.2 创建EncodingFilter 2.4 Filter的生命周期2.4.1 回顾Servlet生命周期2.4.1.1 Servlet的创建时机2.4.1.2 Servle…