大家好,我是吴师兄。
今天在朋友圈看到一张图片:
某大厂开始“捡漏”35+的人员了
。
好家伙,如果是真的,那程序员可就越老越吃香了,按道理,从古至今,技术活本来就应该是这样的待遇,学的越久、懂得越多、接触的越多,应该是能更加游刃有余的处理好本质工作,而不应该像现在这样,从 20 岁出头开始工作,每年都要几乎从头开始学一门新的技术、新的框架、新语言,结果到 35 岁时发现一场空。
今年有很多人在像我咨询转码的时候,都非常焦虑,最焦虑的一个问题就是到 35 岁是不是就意味着失业,是不是要跳槽其它行业,哪怕他们还只是在校的大学生,20 岁出头的样子,距离 35 岁还有十几年便开始
未雨绸缪
的想着那个时间点的规划。
确实,35 岁,对于许多人来说,似乎是一个职业生涯的分水岭。
传统观念中,35 岁意味着稳定,意味着要有一定的职业成就,似乎一切都已经尘埃落定。
但对一些人来说,这也可能是一个重新出发的节点,或许是生活所迫,或许是兴趣爱好,还是有一些人选择在临近 35 岁的时候做一次跳槽转型,有不少学员就是典型的例子。
A 学员开始转码的时候,已经快 35 岁了,一开始学的过程非常吃力,经常感觉脑细胞不够用了。
A 并不是技术出身,转型对他来说,最开始是一次巨大的挑战。每当遇到代码中那些复杂的逻辑和抽象的概念时,A 总感觉自己脑子转不过来。
数据结构的链表、树、图,这些对初学者来说本就艰深的概念,曾一度让他怀疑自己的选择
。
尽管过程艰辛,三个月后,他成功收到了 offer 。
或许,对于他来说,35 岁是他的最后一次跳槽,跳槽到互联网行业,未来都在互联网行业耕耘
。
...
回归我们公众号的主题。
继续来一道和「大厂秋招」相关的算法原题。
题目描述
平台:LeetCode
题号:931
题目描述:下降路径最小和
给你一个
n x n
的
方形
整数数组
matrix
,请你找出并返回通过
matrix
的
下降路径
的
最小和
。
下降路径
可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置
(row, col)
的下一个元素应当是
(row + 1, col - 1)
、
(row + 1, col)
或者
(row + 1, col + 1)
。
示例 1:
输入:
matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:
13
解释:
如图所示,为和最小的两条下降路径
示例 2:
输入:
matrix = [[-19,57],[-40,-5]]
输出:
-59
解释:
如图所示,为和最小的下降路径
提示:
-
n == matrix.length == matrix[i].length
-
-
-100 <= matrix[i][j] <= 100
解题思路
本题是典型的动态规划问题,使用动态规划的方式来逐层计算最小路径和。
-
-
使用一个二维数组
dp[i][j]
表示从第一行到达第
i
行第
j
列的最小路径和。
-
当前状态
dp[i][j]
可以由上一行的三个位置到达,即
dp[i-1][j]
(正上方)、
dp[i-1][j-1]
(左上方)、
dp[i-1][j+1]
(右上方)中的最小值加上当前位置的值:
dp[i][j] = matrix[i - 1][j - 1] + min(dp[i - 1][j], dp[i - 1][j - 1], dp[i - 1][j + 1])
-
第1行的最小路径和就是第1行本身的元素值,因此初始化
dp[0][j] = matrix[0][j]
。
-
当列在边界时,需要特别处理。比如,如果是第一列,那么左上角
dp[i-1][j-1]
就不存在,因此可以设置为一个很大的值;同理,对于最右列,右上角
dp[i-1][j+1]
也需要特殊处理。
-
结果是最后一行的所有
dp[n-1][j]
中的最小值,因为下降路径可以从最后一行的任意位置结束。
参考代码
class Solution:
def minFallingPathSum(self, matrix: List[List[int]]) -> int:
# 矩阵大小
n = len(matrix)
# 创建 dp 数组来存储每个位置的最小路径和
dp = [[0] * (n + 2) for _ in range(n + 1)]
# 初始化边界的值为无穷大,防止越界
for i in range(1