LeetCode-1483. 树节点的第 K 个祖先

原题链接:LeetCode-1483. 树节点的第 K 个祖先

题面

给你一棵树,树上有 n 个节点,按从 0n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。

树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。

实现 TreeAncestor 类:

  • TreeAncestor(int n, int[] parent) 对树和父数组中的节点数初始化对象。
  • getKthAncestor(int node, int k) 返回节点 node 的第 k 个祖先节点。如果不存在这样的祖先节点,返回 1

方法一

p a [ x ] [ i ] pa[x][i] pa[x][i]代表着第 x x x节点的第 2 i 2^i 2i个父节点的序号,即 x x x 2 i + 1 2^{i+1} 2i+1个父节点等于 x x x的第 2 i 2^i 2i个父节点的第 2 i 2^i 2i个父节点,以此类推。
p a [ x ] [ i + 1 ] = p a [ p a [ x ] [ i ] ] [ i ] pa[x][i+1]=pa[pa[x][i]][i] pa[x][i+1]=pa[pa[x][i]][i]

class TreeAncestor {private int[][] pa; // pa[x][i]: x节点的2^i个父节点public TreeAncestor(int n, int[] parent) {int m = 32 - Integer.numberOfLeadingZeros(n); // 二进制长度pa = new int[n][m];// initfor (int i = 0; i < n; i++) {pa[i][0] = parent[i];}for (int i = 0; i < m - 1; i++) {for (int x = 0; x < n; x++) {int p = pa[x][i];pa[x][i + 1] = p < 0 ? -1 : pa[p][i];}}}public int getKthAncestor(int node, int k) {int m = 32 - Integer.numberOfLeadingZeros(k);for (int i = 0; i < m; i++) {if (((k >> i) & 1) > 0) {node = pa[node][i];if (node < 0) break;}}return node;}public int getKthAncestor2(int node, int k) {for (; k > 0 && node != -1; k &= k - 1) {node = pa[node][Integer.numberOfTrailingZeros(k)];}return node;}
}

LCA模版

求树上任意两个节点的最近公共祖先模版方法

  1. 使用DFS初始化depth数组
  2. 我们可以先把更靠下的 y y y 更新为 y y y 的第 depth[y]-depth[x] 个祖先节点,这样 x x x y y y 就处在同一深度了
  3. 再不断从x,y往上跳跃,直到无法跳跃或x==y

循环结束, x x x l c a lca lca只有一步之遥,即 l c a = p a [ x ] [ 0 ] lca=pa[x][0] lca=pa[x][0]

/*** LCA模版*/
class TreeAncestor {private int[] depth;private int[][] pa;public TreeAncestor2(int[][] edges) {int n = edges.length;int m = 32 - Integer.numberOfLeadingZeros(n);List<Integer>[] g = new ArrayList[n];Arrays.setAll(g, e -> new ArrayList<>());for (var e : edges) {int x = e[0], y = e[1];g[x].add(y);g[y].add(x);}depth = new int[n];pa = new int[n][m];dfs(g, 0, -1);for (int i = 0; i < m - 1; i++) {for (int x = 0; x < n; x++) {int p = pa[x][i];pa[x][i + 1] = p < 0 ? -1 : pa[p][i];}}}private void dfs(List<Integer>[] g, int x, int fa) {pa[x][0] = fa;for (int y : g[x]) {if (y != fa) {depth[y] = depth[x] + 1;dfs(g, y, x);}}}public int getKthAncestor(int node, int k) {for (; k > 0; k &= k - 1) {node = pa[node][Integer.numberOfTrailingZeros(k)];}return node;}public int getLCA(int x, int y) {if (depth[x] > depth[y]) {int t = y;y = x;x = t;}//使得x,y在同一个深度y = getKthAncestor(y, depth[y] - depth[x]);if (y == x) {return x;}for (int i = pa[x].length - 1; i >= 0; i--) {int px = pa[x][i], py = pa[y][i];if (px != py) {x = px;y = py;}}return pa[x][0];}
}

相关题目

2846. 边权重均等查询

参考资料

https://leetcode.cn/problems/kth-ancestor-of-a-tree-node/solutions/2305895/mo-ban-jiang-jie-shu-shang-bei-zeng-suan-v3rw

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

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

相关文章

《Is dataset condensation a silver bullet for healthcare data sharing?》

一篇数据浓缩在医疗数据集应用中的论文。 其实就是在医疗数据集上使用了data condensation的方法&#xff0c;这里使用了DM的方式&#xff0c;并且新增了浓缩时候使用不同的网络。 1. 方法 数据浓缩DC的目的是&#xff1a; E x ∼ P D [ L ( φ θ O ( x ) , y ) ] ≃ E x ∼…

【Vue3+Vite】Vue3视图渲染技术 快速学习 第二期

文章目录 一、模版语法1.1 插值表达式和文本渲染1.1.1 插值表达式 语法1.1.2 文本渲染 语法 1.2 Attribute属性渲染1.3 事件的绑定 二、响应式基础2.1 响应式需求案例2.2 响应式实现关键字ref2.3 响应式实现关键字reactive2.4 扩展响应式关键字toRefs 和 toRef 三、条件和列表渲…

考研高数(共轭根式)

1.定义 共轭根式&#xff1a;是指两个不等于零的根式A、B&#xff0c;若它们的积AB不含根式&#xff0c;则称A、B互为共轭根式。 共轭根式的一个显著特点是通过相乘能把根号去掉&#xff0c;这是很有帮助的 2.常用的共轭根式 3.例题 1&#xff09;求极限 2&#xff09;证明…

常见分类网络的结构

VGG16 图片来自这里 MobilenetV3 small和large版本参数,图片来着这里 Resnet 图片来自这里

C++(8) 运算符重载

文章目录 运算符重载1.1 运算符概述1.2 运算符 重载1.3 运算符 << 重载 运算符重载 1.1 运算符概述 针对当前程序中常用的运算符&#xff0c;可以实现目标运算符处理当前数据类型的方式修改 需求&#xff1a; "ABCD" "BDC" > "ABCDBDC&qu…

长度最小的子数组(c++题解)

题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 输入格式 第一行输入两个整数n 和 target 第二行输入包含有n个元…

【Deep Dive: AI Webinar】数据合作和开源人工智能

【深入探讨人工智能】网络研讨系列总共有 17 个视频。我们按照视频内容&#xff0c;大致上分成了 3 个大类&#xff1a; 1. 人工智能的开放、风险与挑战&#xff08;4 篇&#xff09; 2. 人工智能的治理&#xff08;总共 12 篇&#xff09;&#xff0c;其中分成了几个子类&…

课程表分析

课程表分析 class Course(models.Model):name models.CharField(max_length64)title models.CharField(max_length64)students models.IntegerField(default0)level models.IntegerField(choices((0, 入门), (1, 进阶)), default0)time models.IntegerField(default0)det…

02、全文检索 ------ Solr(企业级的开源的搜索引擎) 的下载、安装、Solr的Web图形界面介绍

目录 Solr 的下载和安装Solr的优势&#xff1a;Lucene与Solr 安装 Solr1、下载解压2、添加环境变量3、启动 Solr Solr 所支持的子命令&#xff1a;Solr 的 Core 和 Collection 介绍Solr 的Web控制台DashBoard&#xff08;仪表盘&#xff09;Logging&#xff08;日志&#xff09…

代码随想录算法训练营29期|day34 任务以及具体任务

第八章 贪心算法 part03 1005.K次取反后最大化的数组和 class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序&#xff0c;注意要按照绝对值的大小nums IntStream.of(nums).boxed().sorted((o1, o2) -> Math.ab…

华为1.24秋招笔试题

华为1.24秋招笔试题 1.题目1 题目详情 - 2024.1.24-华为秋招笔试-第一题-计算积分 - CodeFun2000 1.1题解 import java.util.Scanner;class Main{public static void main(String[] args){Scanner scnew Scanner(System.in);String ssc.next();char[] chs.toCharArray();in…

【INTEL(ALTERA)】如何在 Windows 操作系统上设置 Design Space Explorer II 远程 SSH 场

说明 从英特尔 Quartus Prime Pro Edition 软件 22.1 版本开始&#xff0c;您可以选择使用 Windows OpenSSH 服务器设置 Design Space Explorer II &#xff08;DSE II&#xff09;。 解决方法 1.让 DSE II 与 OpenSSH 协同工作的第一步是 安装 OpenSSH。应在远程主机上安装 Op…

electron从入门到打包exe

1.安装electron npm一直失败&#xff0c;我就cnpm安装的 2.创建一个简单示例&#xff1a; 新建一个文件夹&#xff0c;然后cmd 先搞个package.json: npm init -y然后再添加electron依赖 cnpm install electron然后再写个main.js const { app, BrowserWindow, Menu } req…

C++中的类的引入

一、类的引入 在C语言的结构体中只能定义变量&#xff1b;在C的结构体中&#xff0c;不仅可以定义变量&#xff0c;还可以定义函数。 例如&#xff0c;在用C语言实现栈时&#xff0c;结构体struct中只能定义变量&#xff1b;但是如果用C实现&#xff0c;结构体中还可以定义函…

qt语言国际化(翻译),并实现多窗口同时翻译

一、.pro文件中添加支持的语言 在.pro文件中添加下面几句&#xff0c;支持中文和英文 TRANSLATIONS lanague_cn.ts\lanague_en.ts二、通过qt语言家更新翻译生成.ts文件 完成以后在工程目录可以看到.ts文件 三、通过linguist翻译文件 打开文件 将两个文件同时选中&#xf…

【WPF.NET开发】优化性能:图形呈现层

本文内容 图形硬件呈现层定义其他资源 呈现层为运行 WPF 应用程序的设备定义图形硬件功能和性能级别。 1、图形硬件 对呈现层级别影响最大的图形硬件功能包括&#xff1a; 视频 RAM - 图形硬件中的视频内存量决定了可用于合成图形的缓冲区大小和数量。 像素着色器 - 像素着…

c# 海康照相机操作封装类(网口,USB)

需求 在上位机开发中, 海康照相机的使用应该是很常见的,主要是网口通讯的相机用的多,有时也会用一些USB接口相机。以前项目都在赶时间做。没有时间去好好设计和封装。时间长了发现重复代码就很多,还有没有设计和封装的代码,代码份数和相机个数对等,说白了就是一个相机写一…

【优秀案例】回本周期缩短10%!日安装量级高达5000以上!看NetMarvel如何赋能Ball Sort达成多项目标

“合成大西瓜在海外火了” 没想到&#xff0c;在国内已经过气的玩法转战到海外后&#xff0c;还能够翻红的这么彻底&#xff1f; 实际上&#xff0c;市面上很多在本土市场不温不火但转战海外赛道却盈利感人的应用不在少数&#xff0c;比如我们今天的重头戏《Ball Sort - Colo…

iView 中DatePicker日期选择器 v-model不生效的情况

场景 公司项目前段使用的是iview样式库&#xff0c;在开发的过程中&#xff0c;需要使用到时间选择器 使用后发现&#xff0c;输出的时间格式有问题&#xff0c;查看了需要使用到format来设置输出内容&#xff0c;发现不生效 百度… 1、百度后了解到v-model和format使用&…

基于Element的进度条Loading

基于Element的进度条loading组件 前端在中后台项目开发中经常要使用到loading遮罩层在数据交互时展示&#xff0c;目前我使用element组件库的loading&#xff0c;发现不能自定义&#xff0c;loading的样式比较少&#xff0c;官方只提供修改loading的图标和文字。 但是我的需求…