网易首页 > 网易号 > 正文 申请入驻

35岁程序员脑干出血,可能要一辈子做康复。。

0
分享至

专栏:50多种数据结构彻底征服

专栏:50多种经典图论算法全部掌握

最近浙江杭州一位35岁程序员因长期熬夜,导致脑干出血,昏迷了15天,经过紧急治疗后,他在接受媒体采访时说:自己每天早上 7 点起床,到凌晨一两点睡。

这简直是拿生命当儿戏,说实话凌晨一两点睡,20多岁的时候我也遇到过,不过一年也不会超过5次,如果真的睡那么晚,第二天基本上要9点之后起床了。35岁之后就更不能这样搞了,长期下去早晚有出事。

当事人称自己在ICU一共待了28天,后来又去康复医院待了70多天,回家之后也一直在康复和锻炼,现在已经恢复了大约70%,但可能没有办法完全康复了。

他还说:“现在的我看待生活,觉得让自己开心很重要,活得自由一点。之前想着我要挣钱,会在很多方面压制自己,现在的话我觉得更多的可能要去好好体验生活,让自己过得快乐。也希望大家如果觉得累了,就歇一歇,我是前车之鉴。”

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第1483题:树节点的第 K 个祖先,难度是困难。

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

实现 TreeAncestor 类:

1,TreeAncestor(int n, int[] parent) 对树和父数组中的节点数初始化对象。

2,getKthAncestor(int node, int k) 返回节点 node 的第 k 个祖先节点。如果不存在这样的祖先节点,返回 -1 。

示例1:


输入: ["TreeAncestor","getKthAncestor","getKthAncestor","getKthAncestor"] [[7,[-1,0,0,1,1,2,2]],[3,1],[5,2],[6,3]] 输出: [null,1,0,-1]

解释: TreeAncestor treeAncestor = new TreeAncestor(7, [-1, 0, 0, 1, 1, 2, 2]); treeAncestor.getKthAncestor(3, 1); // 返回 1 ,它是 3 的父节点 treeAncestor.getKthAncestor(5, 2); // 返回 0 ,它是 5 的祖父节点 treeAncestor.getKthAncestor(6, 3); // 返回 -1 因为不存在满足要求的祖先节点

  • 1 <= k <= n <= 5 * 10^4

  • parent[0] == -1 表示编号为 0 的节点是根节点。

  • 对于所有的 0 < i < n ,0 <= parent[i] < n 总成立

  • 0 <= node < n

  • 至多查询 5 * 10^4 次

问题分析

这题让返回某个节点的第 k 个祖先节点,并且查询次数高达 5 * 10^4 ,如果每次查询的时候都要重新找,肯定是不行的。因为这题没有对树修改的函数,所以这棵树是固定的,我们可以先计算所有节点的第 x 个祖先节点,查询的时候就会更加方便。

我们这里使用倍增的思想,定义数组dp[i][j]表示节点 i 的第 2^j 个祖先。很明显当 j 等于 0 的时候,dp[i][0]表示的是节点 i 的父节点。

找到每个节点的父节点了,那么肯定也能找到每个节点父节点的父节点,也就是dp[i][1]=dp[dp[i][0]][0],也就是说节点 i 的第 2^1 个祖先是节点 i 的第 2^0 个祖先的第 2^0 个祖先。

更进一步我们可以得出节点 i 的第 2^j 个祖先是节点 i 的第 2^(j-1) 个祖先的第 2^(j-1) 个祖先。举个例子,节点 i 的第 8 个祖先节点是它的第 4 个祖先节点的第 4 个祖先节点。

所以我们可以得到:dp[i][j]=dp[dp[i][j-1]][j-1],但这样计算的结果是不完整的,比如计算 i 的第 13 个祖先节点,我们可能最多只能计算它的第 8 个祖先节点,但这不影响查询。

在进行查询的时候我们是根据这个数字的二进制进行查询的。比如 13 的二进制是 1101,我们只需要往上先查询 i 的第 1 个,然后第 4 个,最后第 8 个,最终结果就是 i 的第 13 个祖先节点。

JAVA:

class TreeAncestor {     int bits;// n 的最大位数     // dp[i][j] 表示节点 i 的第 2^j 个祖先     int[][] dp;     public TreeAncestor(int n, int[] parent) {         bits = (int) (Math.log(n) / Math.log(2)) + 1;         dp = newint[n][bits];         for (int i = 0; i < n; i++)             Arrays.fill(dp[i], -1);// 全部默认为 -1 。         // 所有节点的第一个祖先是它的父节点。         for (int i = 0; i < n; i++)             dp[i][0] = parent[i];         // 节点 i 的第 2^j 个祖先也是节点 i 的第2^(j-1)个祖先的第2^(j-1)个祖先。         for (int j = 1; j < bits; j++) {             for (int i = 0; i < n; i++) {                 // i 的第2^(j-1)个祖先就是dp[i][j - 1]。                 if (dp[i][j - 1] != -1) dp[i][j] = dp[dp[i][j - 1]][j - 1];             }         }     }     // 利用二进制的特性使用倍增查询。     public int getKthAncestor(int node, int k) {         for (int j = 0; j < bits; j++) {             // 比如 k 是13,它的二进制是1101,只有二进制中是 1 的时候才需要查询,             // 先往上查 1 个,在往上查 4 个,最后在往上查 8 个,正好查找第 13 个。             if (((k >> j) & 1) == 1) {                 // 从node开始往上查询第 2^j 个。                 node = dp[node][j];                 if (node == -1)// 如果为 -1 ,说明不存在第 k 个祖先。                     return -1;             }         }         return node;     } }

C++:

class TreeAncestor { private:     int bits; // n 的最大位数     vector

 > dp; // dp[i][j] 表示节点 i 的第 2^j 个祖先 public:     TreeAncestor(int n, vector

 &parent) {         bits = (int) (log(n) / log(2)) + 1;         dp = vector

 >(n, vector

 (bits, -1)); // 初始化为 -1         // 所有节点的第一个祖先是它的父节点。         for (int i = 0; i < n; i++)             dp[i][0] = parent[i];         // 节点 i 的第 2^j 个祖先也是节点 i 的第2^(j-1)个祖先的第2^(j-1)个祖先。         for (int j = 1; j < bits; j++) {             for (int i = 0; i < n; i++) {                 // i 的第2^(j-1)个祖先就是dp[i][j - 1]。                 if (dp[i][j - 1] != -1)                     dp[i][j] = dp[dp[i][j - 1]][j - 1];             }         }     }     // 利用二进制的特性使用倍增查询。     int getKthAncestor(int node, int k) {         for (int j = 0; j < bits; j++) {             // 比如 k 是13,它的二进制是1101,只有二进制中是 1 的时候才需要查询,             // 先往上查 1 个,在往上查 4 个,最后在往上查 8 个,正好查找第 13 个。             if (((k >> j) & 1) == 1) {                 // 从node开始往上查询第 2^j 个。                 node = dp[node][j];                 if (node == -1)// 如果为 -1 ,说明不存在第 k 个祖先。                     return-1;             }         }         return node;     } };




笔者简介

博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
汽柴油即将下调!3月29日92/95号汽油最新价,4月7日调价窗口开启

汽柴油即将下调!3月29日92/95号汽油最新价,4月7日调价窗口开启

沙雕小琳琳
2026-03-29 10:28:54
大陆发布统一后安排,蔡正元赶在坐牢前,留下5个字,措辞不寻常

大陆发布统一后安排,蔡正元赶在坐牢前,留下5个字,措辞不寻常

近史博览
2026-03-29 16:06:11
双预警齐发!冷空气即将抵达天津!最低温降至6℃!

双预警齐发!冷空气即将抵达天津!最低温降至6℃!

天津生活通
2026-03-29 19:28:36
统治力!上海逆转三杀山西豪取13连胜 压卫冕冠军保住联赛第一

统治力!上海逆转三杀山西豪取13连胜 压卫冕冠军保住联赛第一

醉卧浮生
2026-03-29 21:38:20
被指责“强行”侵权演唱《李白》,单依纯道歉!李荣浩再发四连问:无授权你用什么立场、什么权利、什么角度、什么心态演唱?

被指责“强行”侵权演唱《李白》,单依纯道歉!李荣浩再发四连问:无授权你用什么立场、什么权利、什么角度、什么心态演唱?

每日经济新闻
2026-03-29 17:39:06
达芬奇《最后的晚餐》为何如此出名?放大10倍后,看看犹大的手!

达芬奇《最后的晚餐》为何如此出名?放大10倍后,看看犹大的手!

蒋南强读历史
2026-03-22 11:05:08
反转了! 刘晓庆妹妹录音曝光:她要是真把房子捐国家,我们签字配合

反转了! 刘晓庆妹妹录音曝光:她要是真把房子捐国家,我们签字配合

陈意小可爱
2026-03-28 15:49:01
2小时闭门激战!心腹当场倒戈?马英九急撤杀招,蓝营内斗迎3结局

2小时闭门激战!心腹当场倒戈?马英九急撤杀招,蓝营内斗迎3结局

杰丝聊古今
2026-03-29 00:06:40
杜锋心腹爱徒!张皓嘉几乎打满全场5中1得2分6板6助 在场效率+49

杜锋心腹爱徒!张皓嘉几乎打满全场5中1得2分6板6助 在场效率+49

狼叔评论
2026-03-29 21:42:04
美国为什么突然打伊朗?一篇文讲清楚

美国为什么突然打伊朗?一篇文讲清楚

李月亮
2026-03-02 20:46:25
苹果加这两样煮水喝,沾床就睡!连打雷都叫不醒!

苹果加这两样煮水喝,沾床就睡!连打雷都叫不醒!

阿天爱旅行
2026-03-29 00:12:41
邵佳一规定:不得外出购物,此前国足0-7输日本还大包小包买特产

邵佳一规定:不得外出购物,此前国足0-7输日本还大包小包买特产

茜子足球
2026-03-29 14:58:56
香港新规:拒绝解锁手机判1年,3类人群最危险

香港新规:拒绝解锁手机判1年,3类人群最危险

全栈遛狗员
2026-03-28 11:45:59
美国会被气死!中国高超导弹用水泥造:想100种可能都没试过水泥

美国会被气死!中国高超导弹用水泥造:想100种可能都没试过水泥

近史谈
2026-03-28 21:46:03
苹果突然给3亿旧iPhone发"死亡通知":不升级就等被偷

苹果突然给3亿旧iPhone发"死亡通知":不升级就等被偷

算力游侠
2026-03-28 10:47:23
“黄毛的爹,酗酒的妈”,上海三口之家火了,只有孩子看着不叛逆

“黄毛的爹,酗酒的妈”,上海三口之家火了,只有孩子看着不叛逆

妍妍教育日记
2026-03-29 07:40:03
八大军区司令员对调时,八位司令员的年龄分别是多大?谁最年轻?

八大军区司令员对调时,八位司令员的年龄分别是多大?谁最年轻?

微史纪
2026-03-29 13:09:36
车长期不开,最多能停几天?记住这个数,不伤车、不毁电瓶

车长期不开,最多能停几天?记住这个数,不伤车、不毁电瓶

沙雕小琳琳
2026-03-27 08:29:51
三板退市股狂飙!59天拉58个板,大涨超1000%

三板退市股狂飙!59天拉58个板,大涨超1000%

21世纪经济报道
2026-03-29 20:30:44
马卢阿奇12分9篮板!首轮秀仅杨瀚森未得分上双

马卢阿奇12分9篮板!首轮秀仅杨瀚森未得分上双

体坛周报
2026-03-29 14:32:16
2026-03-29 22:48:49
数据结构和算法
数据结构和算法
专门介绍和写算法题解的号
272文章数 4关注度
往期回顾 全部

科技要闻

马斯克承认xAI"建错了",11位创始人均离职

头条要闻

美军地面战"数周速决"方案披露 欲复刻"42天灭伊"神话

头条要闻

美军地面战"数周速决"方案披露 欲复刻"42天灭伊"神话

体育要闻

绝杀卫冕冠军后,他单手指天把胜利献给父亲

娱乐要闻

张凌赫事件持续升级!官方点名怒批

财经要闻

Kimi、Minimax 们的算力荒

汽车要闻

岚图泰山X8配置曝光 四激光雷达/华为新一代座舱

态度原创

教育
时尚
亲子
旅游
房产

教育要闻

关于举办新时代中小学劳动教育高质量发展研讨会的通知

来到1980的周也,好毛利兰

亲子要闻

夏天来了,如何给小宝宝洗澡?具体步骤如下

旅游要闻

半日游、一日游都有!南京栖霞发布首批27条精品研学路线

房产要闻

首日430组来访,单日120组认筹!海口首个真四代,彻底爆了!

无障碍浏览 进入关怀版