A:257. 二叉树的所有路径#
あなたには、二分木のルートノードが与えられます。任意の順序で、ルートノードから葉ノードまでのすべてのパスを返します。
葉ノードは、子ノードを持たないノードを指します。
入力:root = [1,2,3,null,5]
出力:["1->2->5","1->3"]
問題は比較的簡単かもしれませんが、アルゴリズム問題を 2 日間解いた後なので、少し状態があるかもしれません。今回は比較的スピーディに解けました。以下は提出したコードです:
/**
* 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 の CEO である Sam Altman 氏が、生産性についての自身の考えを説明するために書いたものです。以下は彼のいくつかの視点と経験です:
複利は金融の概念だけでなく、キャリアの概念でもあり、キャリアの複利は魔法のようです。
何をするかについて#
無価値な方向に速く進んでも意味がありません。生産性にとって重要なのは、正しいことをすることですが、これはしばしば見落とされます。独自の考えを持つことは難しいですが、練習すれば上達します。
印象的な人々は、強い信念を持っています。ほとんどの人にはこのような信念がありません。これは勇気を意味します。この信念は、他の人とは異なる意見を持つ勇気を与えます。時には間違いを犯しても、信念を失ってはいけません。間違いを犯すことは正常です。
何をするかを考えるために、スケジュールに余裕を持たせることが重要です。Sam の方法は、本を読むこと、興味深い人との会話、自然の中で過ごすことです。
嫌いなことに時間を費やすと効率が低下します。Sam はできるだけそれらのことを他の人に任せたり、避けたりするようにしています。優れた委託方法は、それらのことが好きな人を見つけることです。彼らはそれらのことをより良く、効率的に行うことができます。嫌いなことをすることは、士気とモチベーションを下げます。
重要なのは、学びたいことは何でも学べるということです。すぐには信じられないかもしれませんが、継続すればできることに気づくでしょう。
素晴らしい仕事は通常、同僚と協力して行われます。賢く、効率的で、幸せで、前向きな人と一緒に働くことは、野心を打ち砕くことはありませんが、逆の人と一緒に働くことは大きな代償を伴います。
優先順位について#
優先順位付けのシステムには 3 つの原則があります:1. 重要なことを完了することを確保すること。2. 愚かなことに時間を浪費しないこと。3. 多くのタスクリストを作成すること。
多くのタスクリストを作成することは、複数のタスクを同時に進めるのに役立ちます。脳に覚えておく必要がなく、関心のあることをすぐに見つけることができます。
動機づけを生み出す方法で優先順位を決定します:できるだけ多くのことをすると、より良い気分になり、より良い気分になると、より多くのことができるようになります。彼は毎日進展をもたらす方法で毎日を始め、終わらせることが好きです。
会議は避けるようにしましょう。会議の 90%は時間の無駄ですが、残りの 10%はそれを補うことができます。会議の時間は 15〜20 分または 2 時間に設定するのが最適です。
一日の異なる時間帯には、異なることをするようにしましょう。朝の最初の数時間が最も効率的であり、誰も何もスケジュールしないでください。会議は午後に予定してください。注意力が低下し始めたら、休憩して他のことをしましょう。
多くの人々は自分の時間を十分に重視していません - 1 時間で 100 ドルを稼ぐ人が 20 ドルを節約するために数時間を費やすことはありません。
生産性の罠に陥らないようにしましょう。多くの人が自分のシステムを最適化しようとしていますが、正しい問題を処理しているかどうかを考えることを忘れています。間違ったことをしている場合、システムの良し悪しは意味がありません。正しい目標は、一日ではなく一年を最適化することです。
身体的要素について#
体を良い状態に保つための戦略は個人によって異なるかもしれませんが、Sam にとって以下のことをすると少なくとも 1.5 倍の生産性向上が感じられます(一部一般的でない習慣は記録していません):
- 睡眠は生産性を維持するために最も重要な要素です。睡眠トラッカーは最適な睡眠戦略を見つけるのに役立ちます。継続しやすいのは、設定して忘れられる戦略です。例えば、Emfit QS+Active などです。
- 涼しい、暗い、静かな環境で寝ること。良いマットレスは睡眠の質を大幅に向上させることができます。
- 寝る前にたくさん食べないこと、お酒を飲まないこと。
- 旅行の際は、アイマスクと耳栓を使用すること。
- 運動は体の状態を保つためのもう一つの重要な要素かもしれません。いくつかの月間のさまざまな運動プロジェクトを試した結果、最も良いプロジェクトは週に 3 回 1 時間のウェイトトレーニングで、時折高強度インターバルトレーニングを行うことのようです。生産性の向上だけでなく、最も良い全体的な感じのする運動プロジェクトです。
- 3 番目の重要な要素は栄養です。大量の糖分を摂取することは避けるべきですし、辛い刺激物の食べ物も同様です。甘いものには抵抗力がないため、できるだけ買わないようにしています。
その他#
自然光、静かな環境、邪魔されない作業環境を確保すること。
頻繁に行わなければならない煩雑な作業に対して、カスタムソフトウェアを作成すること。タイピングの速さを向上させる方法やショートカットキーを使用して作業を完了する方法を学ぶこと。
悪い気分を引き起こす人や事柄に触れないようにすること。
計画したことに対して、毎回同じ時間で超過してみてください。これにより、すべてのタスクで効率的に感じることができますが、過度の超過は災害的です。
家族や友人、自分の好きなことを無視しないでください。そうしないと、不幸になり、生産性にも影響します。
最後にもう一度言いますが:間違った方向で生産性を話すことは意味がありません。重要なのは、何をするかを明確にすることです。
T:Jupyter Kernel Gateway#
これは Jupyter 公式のプロジェクトであり、Jupyter カーネルを API 化し、Jupyter Notebook や Jupyterlab に依存せずにサーバーを起動するためのものです。
S:「二八原則」についての考察#
行動する前に何を望んでいるかを明確にし、何をしたいかではなく何をしたいかを考えるべきです。興味深く、挑戦的なことはたくさんありますが、それらをすべてする時間はありません。結果に焦点を当て、自分が望む部分を把握することが「二八原則」に合致しています。余力があれば、自分がやるべきことをやることができます。
参考文献: