SpaceX 历史级成功
昨晚,马斯克旗下美国太空探索技术公司(SpaceX)进行了星舰的第三次试飞。
先来简单回顾下,前两次的试飞时间线:
- 首次试飞(2023-04):升空2分30秒后火箭姿态失稳并开始旋转,最终解体爆炸,发射未达到预期目的;
- 第二次试飞(2023-11):火箭级间分离后,助推器爆炸,二级仓失联并发生不可控降落,试飞扔未达预期;
前面两次都是放烟花,严格来说连像样的试飞都不算。
试飞的主要目的,是想测算星舰能否达到环绕速度,这是论证人类能否星球移民的关键。
在马斯克之前,以往发射的都是载重规模不大的小型火箭,不具备大面积载人条件。
马斯克的星舰是高120米,重5000吨的巨无霸,差不多就是一栋高40层的常规建筑。
如果能够推动这样的巨无霸,摆脱地球引力,冲向太空,那么普通人可触及星辰大海将不会是梦想。
SpaceX 做到了。
这次没有烟花,星舰带着全人类的期望,一点点在星空中消失不见,就是最好的结果。
我和马斯克都第一时间在各自社交平台表示了祝贺。
这次的试飞达成众多里程碑:完成一二级分离、达到环绕速度、顺利进入轨道。
这是毫无疑问的,值得被载入历史的时刻!!!
虽然星舰在回收的时候,仍然失联,近5000w美元的构建成本又只用了一次,但我们已经得到了最想要的答案。
带着这一丝感动,我必须支持一下马斯克以表尊敬。
小小地买入 1.7k 刀的 TSLA 以表支持:
结果:
资本家不懂马老板的浪漫,真就是 火箭一响,下跌万两。
得亏即使是"投机",我也有严格的止损铁律,于是在买入后上涨 +0.6% 后转头不久后便卖出:
小亏 30 刀,但想想星舰成功发射,这钱亏得乐意。
...
回归主线。
来做一道和「特斯拉」相关的算法原题。
题目描述
平台:LeetCode
题号:687
给定一个二叉树的 root
,返回 最长的路径的长度,这个路径中的每个节点具有相同值。
这条路径可以经过也可以不经过根节点。
两个节点之间的路径长度,由它们之间的边数表示。
示例 1:
ini
输入:root = [5,4,5,1,1,5]
输出:2
示例 2:
ini
输入:root = [1,4,5,4,4,5]
输出:2
提示:
- 树的节点数的范围是 <math xmlns="http://www.w3.org/1998/Math/MathML"> [ 0 , 1 0 4 ] [0, 10^4] </math>[0,104]
- <math xmlns="http://www.w3.org/1998/Math/MathML"> − 1000 < = N o d e . v a l < = 1000 -1000 <= Node.val <= 1000 </math>−1000<=Node.val<=1000
- 树的深度将不超过
1000
递归
设计递归函数 int dfs(TreeNode root)
,含义为传入根节点 root
,返回以该节点为起点,往下走同值路径所能经过的最大路径长度(即不能同时往左右节点走),同时使用全局变量 max
记录答案路径所能经过最大路径长度。
在递归函数内部,先通过递归 root
的左右子节点,拿到以 root.left
和 root.right
为起点的最大路径长度 l
和 r
,然后根据当前节点值和左右子节点值的相等关系来更新 ans
,同时用 cur
维护「以当前节点 root
为目标路径中深度最小(位置最高)节点时」所经过的最大路径长度。
Java 代码:
Java
class Solution {
int max = 0;
public int longestUnivaluePath(TreeNode root) {
dfs(root);
return max;
}
int dfs(TreeNode root) {
if (root == null) return 0;
int ans = 0, cur = 0, l = dfs(root.left), r = dfs(root.right);
if (root.left != null && root.left.val == root.val) {
ans = l + 1; cur += l + 1;
}
if (root.right != null && root.right.val == root.val) {
ans = Math.max(ans, r + 1); cur += r + 1;
}
max = Math.max(max, cur);
return ans;
}
}
C++ 代码:
C++
class Solution {
public:
int maxv = 0;
int dfs(TreeNode* root) {
if (root == nullptr) return 0;
int ans = 0, cur = 0;
int l = dfs(root->left), r = dfs(root->right);
if (root->left != nullptr && root->left->val == root->val) {
ans = l + 1; cur += l + 1;
}
if (root->right != nullptr && root->right->val == root->val) {
ans = max(ans, r + 1); cur += r + 1;
}
maxv = max(maxv, cur);
return ans;
}
int longestUnivaluePath(TreeNode* root) {
dfs(root);
return maxv;
}
};
Python 代码:
Python
class Solution:
def longestUnivaluePath(self, root: Optional[TreeNode]) -> int:
maxv = 0
def dfs(root):
nonlocal maxv
if not root: return 0
ans, cur = 0, 0
l, r = dfs(root.left), dfs(root.right)
if root.left and root.left.val == root.val:
ans = l + 1
cur += l + 1
if root.right and root.right.val == root.val:
ans = max(ans, r + 1)
cur += r + 1
maxv = max(maxv, cur)
return ans
dfs(root)
return maxv
TypeScript 代码:
TypeScript
let max = 0;
function longestUnivaluePath(root: TreeNode | null): number {
max = 0
dfs(root)
return max
};
function dfs(root: TreeNode | null): number {
if (root == null) return 0
let ans = 0, cur = 0, l = dfs(root.left), r = dfs(root.right)
if (root.left != null && root.left.val == root.val) {
ans = l + 1; cur += l + 1
}
if (root.right != null && root.right.val == root.val) {
ans = Math.max(ans, r + 1); cur += r + 1
}
max = Math.max(max, cur)
return ans
}
- 时间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n ) O(n) </math>O(n)
- 空间复杂度:忽略递归带来的额外空间开销,复杂度为 <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( 1 ) O(1) </math>O(1)
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉