A:257. 二叉树的所有路径#
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
可能题目比较简单,也可能写了两天算法题了稍微有了一点状态,这次比较快速,一遍就过了。以下是提交的代码:
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function binaryTreePaths(root: TreeNode | null): string[] {
const result: string[] = []
const dfs = (node: TreeNode | null, path: string) => {
if (!node || node.val === null) {
return
}
const currentPath = `${path}${path ? '->' : ''}${node.val}`
if (!node.left && !node.right) {
result.push(currentPath)
}
dfs(node.left, currentPath)
dfs(node.right, currentPath)
}
dfs(root, '')
return result
};
这段提交的结果是:
Your runtime beats 93.55 % of typescript submissions
Your memory usage beats 53.22 % of typescript submissions (44.2 MB)
深度优先搜索的基本思想是首先访问一个节点,然后再尝试访问与之相连的节点,并以此类推,直到没有未访问的节点为止。递归是实现 DFS 的一个非常常用的方法。
标准 DFS 算法的核心思想为:
- 递归地探索每个节点。
- 对于已访问的节点,进行标记,以避免重复访问。
- 遍历所有相邻节点。
上面二叉树问题的特殊性在于只需考虑二叉树的左右子节点,并且没有必要标记节点,因为树结构保证了没有循环路径。
R:Productivity#
这篇文章的作者是 OpenAI 的总裁 Sam Altman,因为总被问到生产力的问题,所以专门写了一篇文章来说明自己对生产力的看法。以下是他的一些观点和经验:
复利不只是金融概念,也是职业概念,职业的复利也像魔法一般。
关于做什么#
在无价值的方向上走得多快都没有意义,对于生产力而言最重要的是做正确的事情,这一点常常被忽略。独立思考很难但多加练习就可以做得更好。
遇到的令人印象深刻的人都有强烈的信念感,这种信念感在大多数人身上时没有的。这也意味着勇气,这种信念要让你敢于反对,敢于和大多数人不一样。即使有时候犯错了也不要磨灭信念感,因为犯错是正常的。
确保在日程中留足空余的时间来想想要做什么。Sam 的方式是读书、和有趣的人闲聊还有呆在野外。
做不喜欢的事情上效率会很低,Sam 会尽量把这些事情委托出去或者避开它们,比较好的委托方式是找到喜欢做这些事的人,他们能把这些事做得更好更高效。做不喜欢的事情会拖累自己的士气和动力。
很重要的是你可以学会任何你想学的事情,你可以很快地进步。一开始你可能认为这除非是奇迹,但最终只要你坚持就能够发现你可以做到。
伟大的工作通常需要和同事一起协作完成,和聪明、高效、快乐、积极的人一起工作不会打击你的雄心,而和相反的人一起工作则会有很大的代价。
关于优先级#
优先级系统有三大原则:1. 确保完成重要的事情;2. 不在蠢事上浪费时间;3. 列许多待办清单。
列许多待办清单有助于多任务同时开展,而不用把这些事情记在脑子中,而且不置身事内的时候,可以很快地找到感兴趣的事情去做。
以一种产生动力的方式来确定优先级:做得越多就感觉越好,感觉越好就能做得越多,他喜欢以一种能让事情取得进展的方式开启和结束每一天。
尽量避免会议,有 90% 的会议是浪费时间的,剩下 10% 就可以弥补这些会议的内容。会议时间最好安排在 15-20 分钟之间,或者是两小时的长会。
一天的不同时间段从事不同的事情,早上的前几个小时最高效,不会让任何人安排任何事,会议都定在下午。如果注意力开始下降了,就休息一下换件事做。
大部分人都不够重视自己的时间 - 一个小时能挣 $100 的人却花几个小时去做一件不喜欢的事情来省下 $20。
不要落入生产力陷阱,许多人在想怎么优化自己的系统却没有好好想想是否在处理正确的问题。如果在做错误的事情,系统好不好都没有意义。正确的目标是优化你的一年,而不是你的一天。
关于身体因素#
让身体保持一个好的状态,策略可能因人不同,对 Sam 来说做好以下的事情感觉可以至少有 1.5 倍的生产力提升(一些不太具有普适性的习惯我没有做记录):
- 睡眠是保持生产力最重要的因素,睡眠追踪器可以帮助寻找最佳的睡眠策略。比较容易坚持的是设置之后就可以忘掉的策略,比如 Emfit QS+Active。
- 在凉爽、黑暗、安静的环境里睡觉,一个好的床垫能极大改善睡眠质量
- 睡前不要吃太多东西,不要喝酒
- 旅行的时候,使用眼罩和耳塞
- 锻炼可能是保持身体状态的另一重要因素。试过几个月的不同运动项目后,似乎最好的项目是每周三次举重一个小时,偶尔进行高强度间歇训练。除了生产力的提高,这也是整体感觉最好的运动项目。
- 第三个重要因素是营养。食用大量的糖是要极力避免的事情,还有辛辣的刺激性食物。因为对甜食没有抵抗力,所以尽量不要把它们买回来
其它#
确保自然光、安静、不会被打扰的工作环境。
对于必须要频繁要做的琐事,写定制化软件来完成。学习怎么打字更快以及快捷键操作来完成工作。
避免接触会引起坏情绪的人和事。
对于计划要做的事情,每次尝试在相同时间超额完成一些,这可以在每件事上都感觉到高效,但过度的超额也是灾难性的。
不要忽略了家人朋友还有自己喜欢的事情,否则你会不开心,也会影响生产力。
最后再重复一次:在错误的方向上讲生产力没有意义,更重要的是想清楚要做什么。
T:Jupyter Kernel Gateway#
Jupyter 官方的项目,用于将 Jupyter kernel API 化,不依赖 Jupyter Notebook 或 Jupyterlab 直接启动服务。
S:关于 “二八原则” 的一个思考#
行动之前先想清楚想要什么,而不是想做什么。有兴趣点有挑战的事情很多,如果每件都做时间是不够用的,对于这些事情结果导向,把握住自己想要的那部分即可,这才符合 28 原则。如果有剩下的精力再去做自己该做的事。
Reference: