谷歌
海的那边,这几天最乐的新闻,是谷歌前 CEO 批评员工不拼命工作后道歉。
今年 4 月,谷歌前 CEO 埃里克·施密特(Eric Schmidt)在斯坦福大学的一次演讲中,被问及 OpenAI 和 Anthropic 等初创公司目前在人工智能领域领先谷歌的原因时,他指出,远程工作削弱了谷歌在人工智能竞赛中的竞争力。
换句话说,这位谷歌前 CEO 将谷歌在 AI 竞赛中落后的原因归咎于居家办公 🤣🤣🤣
施密特表示:
❝谷歌认为,工作与生活的平衡、早点回家、在家工作比业务领先更为重要。而创业公司之所以能成功,是因为人们拼命工作。很抱歉说的这么直白,但事实就是,如果你们都离开大学去开公司,如果你想和其他创业公司竞争,你就不会让员工在家工作,每周只来公司一天。
❞
当时这些观点,并没有掀起太多波澜,毕竟只是高校级的小范围演讲。
直到本周二,施密特当时演讲的视频被斯坦福大学上传到了 YouTube 上。
好家伙,很快施密特就道歉了,承认自己对谷歌及其工作时间的评论有误,为自己的错误感到后悔,斯坦福大学也将包含该评论观点的视频进行了删除。
不知道当时这位 CEO 是为何离职,反正我猜狗家的员工,肯定是够开心的,这么卷的 CEO 不能留,可别起头破坏净土了。
回到这个论点本身,不评论对错。
绝大多数人是依靠拼命工作来获得成功,但也有(看上去)不怎么努力就能到达顶峰的天才,用初创公司的标准去要求谷歌,本身就不合理。
或者施密特这番表达,在他的角度看来是完全在理,但至少说话的方式错了。
...
回归主题。
来一道和「翻转二叉树」(Homebrew 作者 Max Howell 当年面试谷歌没做出来的算法题)差不多难度的题。
题目描述
平台:LeetCode
题号:652
给定一棵二叉树 root
,返回所有重复的子树。
对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
如果两棵树具有相同的结构和相同的结点值,则它们是重复的。
示例 1:
输入:root = [1,2,3,4,null,2,4,null,null,4]
输出:[[2,4],[4]]
示例 2:
输入:root = [2,1,1]
输出:[[1]]
示例 3:
输入:root = [2,2,2,3,null,3,null]
输出:[[2,3],[3]]
提示:
-
树中的结点数在 范围内。
DFS + 哈希表
设计递归函数 String dfs(TreeNode root)
,含义为返回以传入参数 root
为根节点的子树所对应的指纹标识。
对于标识的设计只需使用 "_"
分割不同的节点值,同时对空节点进行保留(定义为空串 " "
)即可。
使用哈希表记录每个标识(子树)出现次数,当出现次数为 2(首次判定为重复出现)时,将该节点加入答案。
Java 代码:
class Solution {
Map<String, Integer> map = new HashMap<>();
List<TreeNode> ans = new ArrayList<>();
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
dfs(root);
return ans;
}
String dfs(TreeNode root) {
if (root == null) return " ";
StringBuilder sb = new StringBuilder();
sb.append(root.val).append("_");
sb.append(dfs(root.left)).append(dfs(root.right));
String key = sb.toString();
map.put(key, map.getOrDefault(key, 0) + 1);
if (map.get(key) == 2) ans.add(root);
return key;
}
}
Typescript 代码:
let ans: Array<TreeNode>
let map: Map<string, number>
function findDuplicateSubtrees(root: TreeNode | null): Array<TreeNode | null> {
ans = new Array<TreeNode>()
map = new Map<string, number>()
dfs(root)
return ans
};
function dfs(root: TreeNode | null): string {
if (root == null) return " "
let key = root.val + "_"
key += dfs(root.left)
key += dfs(root.right)
if (!map.has(key)) map.set(key, 1)
else map.set(key, map.get(key) + 1)
if (map.get(key) == 2) ans.push(root)
return key
}
-
时间复杂度: DFS
过程复杂度为 ,对于每个子树需要构造出与子树同等规模的字符串,复杂度为 。整体复杂度为 -
空间复杂度:
最后
巨划算的 LeetCode 会员优惠通道目前仍可用 ~
使用福利优惠通道 leetcode.cn/premium/?promoChannel=acoier,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉