初学python记录:力扣1483. 树节点的第 K 个祖先

题目:

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

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

实现 TreeAncestor 类:

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

思考:

1.暴力解法:

对节点node,在parent数组中向前逐个溯源,找到第k个祖先节点。代码如下:

class TreeAncestor(object):def __init__(self, n, parent):""":type n: int:type parent: List[int]"""self.n = nself.parent = parentdef getKthAncestor(self, node, k):""":type node: int:type k: int:rtype: int"""for count in range(0, k):index = self.parent[node]node = indexif index == -1:breakreturn index# Your TreeAncestor object will be instantiated and called as such:
# obj = TreeAncestor(n, parent)
# param_1 = obj.getKthAncestor(node,k)

超时了,卡在8 / 17 个例子。

2. 树上倍增算法

参考. - 力扣(LeetCode)

预处理出每个节点的第 2^i 个祖先节点,即第 1,2,4,8,⋯ 个祖先节点(其中 x 的第 1 个祖先节点就是 parent[x])。由于任意 k 可以分解为若干不同的 2 的幂(例:13=8+4+1),所以只需要预处理出这些 2^i 祖先节点,就可以快速地到达任意第 k 个祖先节点。

例如 k=13=8+4+1=1101(2) ,我们可以先往上跳 8 步,再往上跳 4 步和 1 步。无论如何跳,都只需要跳 3 次就能到达第 13个祖先节点。

1. 计算祖先节点:

使用数组 pa[x][i] 表示节点x的第 2^i 个祖先节点,i+1≤log2(n)

pa[x][0] = parent[x]     # x的父亲节点

pa[x][1] = pa[pa[x][0]][0]      # x的爷爷节点

pa[x][2] = pa[pa[x][1]][1]

……

pa[x][i+1] = pa[pa[x][i]][i]      # x的第 2^(i+1) 个祖先节点即x的第 2^i 个祖先节点的第 2^i 个祖先节点。另外,若pa[x][i]=-1,则pa[x][i+1]=-1

2. 拆分k:

从低位(0)到高位判断k的二进制的每一位,若第i位是1,则往上跳 2^i 步,然后判断下一位;若第i位是0,则继续判断下一位。

代码如下(千万注意更新pa数组的代码里,不要写反两个循环的嵌套关系.....血泪的教训T T)

class TreeAncestor(object):def __init__(self, n, parent):""":type n: int:type parent: List[int]"""m = n.bit_length() - 1     # log2(n)=n的二进制位数减一pa = [[p] + [-1] * m for p in parent]    # 包含 parent 列表中每个元素及 m 个 -1 组成的列表for i in range(0, m):for x in range(0, n):     # 循环嵌套关系千万不能变!!否则会出现赋值的时候,pa[pa[x][i]][i]并没有更新的情况,导致pa数组部分值没有更新,而是保持初始值-1if pa[x][i] != -1:pa[x][i+1] = pa[pa[x][i]][i]self.pa = padef getKthAncestor(self, node, k):""":type node: int:type k: int:rtype: int"""n = k.bit_length()    # k的二进制位数for i in range(0, n):if (k >> i) & 1 == 1:node = self.pa[node][i]if node < 0:breakreturn node# Your TreeAncestor object will be instantiated and called as such:
# obj = TreeAncestor(n, parent)
# param_1 = obj.getKthAncestor(node,k)

提交通过:

 

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

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

相关文章

如何解决Redis和数据库的一致性问题?

为了保证Redis和数据库的数据一致性&#xff0c;肯定是要缓存和数据库双写了。 这时候就需要考虑两个问题&#xff1a;是先操作缓存还是先操作数据库&#xff1f;是删除缓存还是更新缓存&#xff1f; 我的建议是优先考虑删除缓存而不是更新缓存&#xff0c;因为删除缓存更加简单…

深度学习理论基础(六)多头注意力机制

目录 一、自定义多头注意力机制1. Scaled Dot-Product Attention2. 多头注意力机制框图&#xff08;1&#xff09;计算公式&#xff08;2&#xff09;具体计算过程&#xff08;3&#xff09;具体代码 二、pytorch中的子注意力机制模块 深度学习中的注意力机制&#xff08;Atten…

数据挖掘实战-基于LSTM算法的HCV检测者分类模型研究

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

VPDN(L2TP、PPTP)

1、虚拟专用拨号网络 远程接入VPN&#xff0c;客户端可以是PC机 技术&#xff1a;L2TP、PPTP 术语&#xff1a;LAC&#xff1a;L2TP的访问集中器 --- 提供用户的接入 LNS&#xff1a;L2TP的网络服务器 --- 提供L2TP服务的服务器 2、技术 1&#xff09;PPTP 点对点隧道…

Mysql启动失败解决过程

报错内容如下&#xff1a; Mar 05 18:40:49 VM-0-12-centos systemd[1]: Failed to start MySQL Server. Mar 05 18:40:49 VM-0-12-centos systemd[1]: Unit mysqld.service entered failed state. Mar 05 18:40:49 VM-0-12-centos systemd[1]: mysqld.service failed. Mar 05…

创建和启动线程

概述 Java语言的JVM允许程序运行多个线程&#xff0c;使用java.lang.Thread类代表线程&#xff0c;所有的线程对象都必须是Thread类或其子类的实例。 Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的&#xff0c;因此把run()方法体称为线程执行体。…

刷题日记——由浅入深的大数加法(高精度加法)

例题 代码 #include <cstdio>int main(){long long a,b;scanf("%lld %lld",&a,&b);printf("%lld\n",ab);}例题——高精度加法 编程计算&#xff1a;12345678912345678912121211231212121212121212121222222111112121&#xff1f; 分析 加…

工程师必备:PW1558 12V/20V过流限压保护芯片,短路无忧,运行更稳定

在电力电子领域&#xff0c;寻找一款能够提供全面保护且性能卓越的电源开关至关重要。PW1558正是这样一款产品&#xff0c;它凭借出色的性能和广泛的应用领域&#xff0c;赢得了业界的广泛认可。下面&#xff0c;我们将从描述、特点和应用三个方面&#xff0c;详细解读PW1558的…

Ideal的使用技巧

一、springcloud项目如何将多个服务放到services中一起启动 1、打开ideal&#xff0c;再view -> Tool Windows -> services 2、在services界面 找到 run configuration type -> springboot即可 二、配置临时的启动参数 1、在edit configurations中 2、选择相应的服务…

C. MEX Game 1

本题如果我们去模拟这个算法的话会很麻烦&#xff0c;也会TLE&#xff0c;首先我们想 1&#xff0c;对于alice来说&#xff0c;先取小的&#xff0c;对于bob来说先删除alic想取的下一个小的 2&#xff0c;那如果这个数多于两个&#xff0c;那也就是说&#xff0c;alice肯定能…

【详细讲解0基础如何进入IT行业】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

UE4_如果快速做出毛玻璃效果_假景深

UE4_如果快速做出毛玻璃效果_假景深 2022-08-20 15:02 一个SpiralBlur-SceneTexture材质节点完成效果&#xff0c;启用半透明材质通过修改BlurAmount数值大小调整效果spiralBlur-SceneTexture custom节点&#xff0c;HLSL语言float3 CurColor 0;float2 BaseUV MaterialFloa…