专栏名称: 程序员小灰
一群喜爱编程技术和算法的小仓鼠。
目录
相关文章推荐
macrozheng  ·  程序员裸辞全职接单一个月的感触! ·  3 天前  
macrozheng  ·  程序员裸辞全职接单一个月的感触! ·  3 天前  
OSC开源社区  ·  效果媲美Cursor的开源替代:Roo-Cline ·  6 天前  
OSC开源社区  ·  KaiwuDB ... ·  5 天前  
码农翻身  ·  我用1小时AI神器,骗过了整个技术团队 ·  1 周前  
51好读  ›  专栏  ›  程序员小灰

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

程序员小灰  · 公众号  · 程序员  · 2024-09-13 11:49

主要观点总结

本文讨论了程序员在职业生涯中面临的挑战,特别是关于35岁以后的职业发展。文章还介绍了一个算法问题——下降路径最小和,并给出了动态规划的解题思路及参考代码。最后,文章提到了数据结构与算法的学习导图,并鼓励求职者继续学习。

关键观点总结

关键观点1: 程序员在职业生涯中面临的挑战

文章讨论了程序员在职业生涯中可能面临的问题,特别是关于年龄和技术的关系,以及对于未来职业的担忧。

关键观点2: 算法问题——下降路径最小和

文章介绍了一个算法问题,即给定一个方形整数数组,找到通过下降路径的最小和。问题使用了动态规划来解决。

关键观点3: 动态规划的解题思路及参考代码

文章详细解释了如何使用动态规划来解决下降路径最小和问题,并给出了参考代码。

关键观点4: 数据结构与算法的学习导图

文章提到小灰制作了一份数据结构与算法的学习导图,并鼓励求职者继续学习和提升技能。


正文

大家好,我是程序员小灰。

今天在朋友圈看到一张图片:某大厂开始“捡漏”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, n + 1):
                dp[i][0] = float('inf')
                dp[i][n + 1] = float('inf')
            
            # 动态规划计算 dp 数组
            for i in range(1, n + 1):
                for j in range(1, n + 1):
                    # 计算当前元素的最小下降路径和
                    dp[i][j] = matrix[i - 1][j - 1] + min(dp[i - 1][j], dp[i - 1][j - 1], dp[i - 1][j + 1])
            
            # 从最后一行找到最小的路径和
            return min(dp[n][1:n+1])


    < END >

    最后,为了帮助近期求职的朋友们,小灰制作了一份数据结构与算法的学习导图,欢迎扫码添加小灰的个人微信,备注“算法”。

    2024年,还剩下最后三个多月,让我们一起共勉 💪。