精品推荐:
《征服数据结构》专栏:50多种数据结构彻底征服。
《经典图论算法》专栏:50多种经典图论算法全部掌握。
这部电影其实很早就想看了,因为它讲述的是一位大龄程序员失业后送外卖的经历,正好上周六抽时间买了一张优惠票19.9元去看了。
整部电影我是怀着沉重的心情看完的,全程没有任何笑点,整个电影院人不是很多,大部分来说还是比较安静的。
就我右边两个女的一直笑个不停,当时我真想把它俩踹出去,人家送外卖摔倒它笑,人家被交警罚它也笑,人家要投诉送外卖的它还笑……,真不知道有啥好笑的,我瞅了它好几眼,它们没看到我。
电影讲述的是一位大龄程序员高志垒,作为一个项目组长被裁了,后来找工作人家闲他年龄大,怕加班猝死,所以工作一直没找到。
我觉得徐峥估计不了解程序员,高志垒是1978年的,应该改成1988年的会更好。
高志垒失业之后家庭开支,又加上父亲病重,小孩上国际学校(学费一年20万),老婆一直没上班,还有高额房贷,又加上之前的p2p暴雷,又加上找不到工作,还有自己之前一直加班导致的糖尿病,真的是很绝望。
先不说经历这么多,就算失业加上高额房贷这两个就很容易让人崩溃。
高志垒找了几个月工作之后,一直没找到,最后选择送外卖,不过电影比较夸张的地方在于为了还房贷,高志垒在刚加入外卖没多久,就成为了该站点的跑单王,关键是他有糖尿病,一直在打胰岛素,我感觉就算往死里跑也很难跑到单王。
这部电影也在告诉我们程序员如果背负高额房贷(1万5或者2万以上)一定要慎重,因为很多房贷都是20年或者30年,程序员根本工作不了那么长时间。
很多程序员失业之后都不知道自己除了写代码还能干啥,就算送外卖,就算每个月都是跑单王,也还不上每月2万的房贷,所以程序员最好保证在5年之内能全部还上(实际上很多人买房的时候都已经30岁了,确实工作不了几年了)。
如果房贷不高的话那就无所谓了,大不了也去送外卖。这部电影只有大龄程序员,只有经历过那种有高额房贷又找不到工作的人看才会在内心产生很强烈的触动。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第437题:路径总和 III。
问题描述
来源:LeetCode第437题
难度:中等
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
示例1:
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。
示例2:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:3
二叉树的节点个数的范围是 [0,1000]
-10^9 <= Node.val <= 10^9
-1000 <= targetSum <= 1000
问题分析
前面我们连续讲了 3 道关于二叉树路径的问题,前面讲的所有路径都是从根节点开始,叶子节点结束。但今天这题也是求的路径问题,这里的路径不一定要从根节点开始,也不一定到叶子节点结束。
其实原理都是一样的,我们可以以每一个节点为起始点进行累减,比如从根节点开始遍历,路径可以需要根节点也可以不需要根节点,最后也不一定到叶子节点结束,只需要累减的值等于某个节点的值,说明找到了一条有效的路径。
JAVA:
public int pathSum(TreeNode root, int targetSum) {
if (root == null)
return 0;
int ans = rootSum(root, targetSum);// 需要根节点
ans += pathSum(root.left, targetSum);// 不需要根节点
ans += pathSum(root.right, targetSum);
return ans;
}
public int rootSum(TreeNode root, long targetSum) {
if (root == null)
return 0;
int ans = 0;
int val = root.val;
if (val == targetSum)
ans++;
ans += rootSum(root.left, targetSum - val);
ans += rootSum(root.right, targetSum - val);
return ans;
}
C++:
public:
int pathSum(TreeNode *root, int targetSum) {
if (!root)
return 0;
int ans = rootSum(root, targetSum);// 需要根节点
ans += pathSum(root->left, targetSum);// 不需要根节点
ans += pathSum(root->right, targetSum);
return ans;
}
int rootSum(TreeNode *root, long targetSum) {
if (!root)
return 0;
int ans = 0;
int val = root->val;
if (val == targetSum)
ans++;
ans += rootSum(root->left, targetSum - val);
ans += rootSum(root->right, targetSum - val);
return ans;
}
Python:
def pathSum(self, root: Optional[TreeNode], targetSum: int) -> int:
def rootSum(tree, targetSum):
if not tree:
return 0
ans = 0
val = tree.val
if val == targetSum:
ans += 1
ans += rootSum(tree.left, targetSum - val)
ans += rootSum(tree.right, targetSum - val)
return ans
if not root:
return 0
ans = rootSum(root, targetSum) # 需要根节点
ans += self.pathSum(root.left, targetSum) # 不需要根节点
ans += self.pathSum(root.right, targetSum)
return ans
笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。