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

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.

相关推荐
热点推荐
日本4-0击败突尼斯后,球迷涌入涩谷十字路口中央庆祝

日本4-0击败突尼斯后,球迷涌入涩谷十字路口中央庆祝

懂球帝
2026-06-21 15:40:40
《教父》柯里昂教导儿子:忠诚是小人物的枷锁,野心是中层人的催命符,真正能登顶的人,只信奉这两条暗规则

《教父》柯里昂教导儿子:忠诚是小人物的枷锁,野心是中层人的催命符,真正能登顶的人,只信奉这两条暗规则

心理观察局
2026-06-20 07:49:03
未来球王!2026世界杯10位怪物级新星!

未来球王!2026世界杯10位怪物级新星!

ChicMyGeek
2026-06-21 11:07:19
廉颇老矣!冯小刚《抓特务》票房萎靡,曾经的商业片之王已成过去

廉颇老矣!冯小刚《抓特务》票房萎靡,曾经的商业片之王已成过去

得得电影
2026-06-21 13:33:59
据北京媒体人透露,许利民确认卸任主教练,李楠为候选人之一

据北京媒体人透露,许利民确认卸任主教练,李楠为候选人之一

格斗联盟有话说
2026-06-21 19:46:45
我国癌症高发,都是包子惹得祸?提醒:这6种食品才是最差的早餐

我国癌症高发,都是包子惹得祸?提醒:这6种食品才是最差的早餐

荆医生科普
2026-06-18 12:00:32
美国专家预言:谁将取代美国?不是中国,答案出人意料

美国专家预言:谁将取代美国?不是中国,答案出人意料

近史谈
2026-06-09 16:42:38
随着一场4-0大胜,日本踢出亚洲最高水平!世界杯第3支出局队诞生

随着一场4-0大胜,日本踢出亚洲最高水平!世界杯第3支出局队诞生

足球评论大家谈
2026-06-21 13:57:10
曝徐艺洋已生子!孩子已3岁,在美国出生,黄子韬将人设不保

曝徐艺洋已生子!孩子已3岁,在美国出生,黄子韬将人设不保

叶公子
2026-06-20 18:26:34
9岁男孩吃了夜市提拉米苏,全麻开腹手术进了ICU:你的那口随便的甜,可能要了孩子的命!

9岁男孩吃了夜市提拉米苏,全麻开腹手术进了ICU:你的那口随便的甜,可能要了孩子的命!

消化石医生
2026-06-09 20:08:20
红岩英雄华子良装疯十四载,解放结局令人肃然起敬

红岩英雄华子良装疯十四载,解放结局令人肃然起敬

清风品历史
2026-06-21 14:47:08
75岁黄维平父亲节潸然泪下!曝儿子酒精中毒去世,大女儿忙前忙后

75岁黄维平父亲节潸然泪下!曝儿子酒精中毒去世,大女儿忙前忙后

裕丰娱间说
2026-06-21 10:20:02
一个残酷现实:大龄剩女,最后基本都嫁给了这3种人

一个残酷现实:大龄剩女,最后基本都嫁给了这3种人

加油丁小文
2026-06-21 05:00:05
苹果6 款新品上架,6月20日,官网已正式开售

苹果6 款新品上架,6月20日,官网已正式开售

科技堡垒
2026-06-20 11:49:08
宋威龙田曦薇釜山领奖:掏小抄讲韩语,浓颜抗住死亡打光

宋威龙田曦薇釜山领奖:掏小抄讲韩语,浓颜抗住死亡打光

乡野小珥
2026-06-21 13:32:19
梅西下战冲击三项历史纪录:进球、胜场及远射数或均成历史第一

梅西下战冲击三项历史纪录:进球、胜场及远射数或均成历史第一

星耀国际足坛
2026-06-21 11:44:26
中超第16轮,辽宁铁人-山东泰山,前瞻:今非昔比

中超第16轮,辽宁铁人-山东泰山,前瞻:今非昔比

足坛超短波
2026-06-21 09:55:58
乌40亿到账,27国联手抗俄后,普京发表战争宣言,只有她出面劝和

乌40亿到账,27国联手抗俄后,普京发表战争宣言,只有她出面劝和

肖兹探秘说
2026-06-20 14:28:31
台湾影坛大佬去世,91名警员在灵堂驻守,李立群陈楚河等众星现身

台湾影坛大佬去世,91名警员在灵堂驻守,李立群陈楚河等众星现身

开开森森
2026-06-20 20:11:35
华为定调Wi-Fi 7专利费:每台终端0.5美元,多模专利池同步就位

华为定调Wi-Fi 7专利费:每台终端0.5美元,多模专利池同步就位

CNMO科技
2026-06-19 12:49:47
2026-06-21 20:43:00
数据结构和算法
数据结构和算法
专门介绍和写算法题解的号
273文章数 4关注度
往期回顾 全部

科技要闻

马斯克拿下7800亿元天价薪酬 2028年可兑现

头条要闻

两年前"震惊世界"的洲际弹道导弹发射 细节披露

头条要闻

两年前"震惊世界"的洲际弹道导弹发射 细节披露

体育要闻

德国的超级替补,10年前还在工厂上班

娱乐要闻

原来她就是张颂文老婆

财经要闻

蔚来的“暗战”时刻

汽车要闻

惊出冷汗!重庆实测奥迪A5L,华为智驾这波操作绝了…

态度原创

游戏
家居
房产
时尚
公开课

《GTA6》疑似泄露两种捆绑包!普通版与豪华版?

家居要闻

绿意盎然 自然之境

房产要闻

商业清零式退潮,大量住宅登场!三亚又要大规模调规!

邮报盘点哈兰德奢侈品收藏:33万镑爱马仕包、28万豪华腕表

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版