专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
汇易咨询  ·  JCI观察:2025年1月印度棕榈油进口创1 ... ·  17 小时前  
BCG波士顿咨询  ·  借力AI,推动车企创造更多现实价值 ·  昨天  
哔哩哔哩  ·  被章子怡轰下台,他犯了哪些面试大忌 ·  2 天前  
51好读  ›  专栏  ›  吴师兄学算法

某大厂开始“捡漏”35+的人员了

吴师兄学算法  · 公众号  ·  · 2024-09-10 21:15

正文

大家好,我是吴师兄。

今天在朋友圈看到一张图片: 某大厂开始“捡漏”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
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100

解题思路

本题是典型的动态规划问题,使用动态规划的方式来逐层计算最小路径和。

  1. 定义状态
  • 使用一个二维数组 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 + 2for _ in range(n + 1)]
            
            # 初始化边界的值为无穷大,防止越界
            for i in range(1






    请到「今天看啥」查看全文