查看原文
其他

那些年薪80-100万,35岁的互联网人,后来都去干嘛了?

博哥 数据结构和算法 2024-04-19

(关注数据结构和算法,了解更多新知识)


最近在网上看到一网友提问,那些年薪80-100万,35岁的互联网人,后来都去干嘛了?


35岁对于程序员来说确实是一个比较伤感的话题,我们来看一下35岁之后的程序员现在都在干啥。


从评论区来看大部分还是继续从事目前的工作,也有不少已经降薪入职的。并且评论区出现最多的一个字就是“苟”,可见大家对自己的工作前景并不看好,原因就是因为自己年龄大了,万一哪天被裁真的不好找工作,所以能苟一天是一天。


--------------下面是今天的算法题--------------


来看下今天的算法题,这题是LeetCode的第64题:最小路径和,这题在华为,腾讯和滴滴的面试中都考过,我们来看下。


问题描述



来源:LeetCode第64题
难度:中等

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小


说明:每次只能向下或者向右移动一步


示例1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]

输出:7

解释:因为路径 1→3→1→1→1 的总和最小。

示例2:

输入:grid = [[1,2,3],[4,5,6]]

输出:12


  • m == grid.length

  • n == grid[i].length

  • 1 <= m, n <= 200

  • 0 <= grid[i][j] <= 200


动态规划解决



这题是让找出一条从左上角到右下角的路径,使得路径上的数字总和最小。这是一道典型的动态规划问题,我们定义dp[i][j]表示从左上角到位置[i,j]的最小值,因为题中说了每次只能向下或向右移动,所以要想到位置[i,j],可以从上面下来,也可以从左边过来,我们取他的最小值即可,递推公式如下图所示:
对于第一行的每个位置,没法从上面下来,只能从左边过来,同理第一列的每个位置只能从上面下来,所以第一行和第一列要单独处理。

JAVA:
public int minPathSum(int[][] grid) {
    int m = grid.length, n = grid[0].length;
    for (int i = 1; i < m; i++)// 第一列只能从上面下来
        grid[i][0] += grid[i - 1][0];
    for (int i = 1; i < n; i++)// 第一行只能从左边过来
        grid[0][i] += grid[0][i - 1];
    for (int i = 1; i < m; i++)
        for (int j = 1; j < n; j++)// 递推公式
            grid[i][j] = Math.min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
    return grid[m - 1][n - 1];
}

C++:
public:
    int minPathSum(vector<vector<int>> &grid) {
        int m = grid.size(), n = grid[0].size();
        for (int i = 1; i < m; i++)// 第一列只能从上面下来
            grid[i][0] += grid[i - 1][0];
        for (int i = 1; i < n; i++)// 第一行只能从左边过来
            grid[0][i] += grid[0][i - 1];
        for (int i = 1; i < m; i++)
            for (int j = 1; j < n; j++)// 递推公式
                grid[i][j] = min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
        return grid[m - 1][n - 1];
    }

C:
#define min(a, b) (((a) < (b)) ? (a) : (b))

int minPathSum(int **grid, int gridSize, int *gridColSize) {
    int m = gridSize, n = gridColSize[0];
    for (int i = 1; i < m; i++)// 第一列只能从上面下来
        grid[i][0] += grid[i - 1][0];
    for (int i = 1; i < n; i++)// 第一行只能从左边过来
        grid[0][i] += grid[0][i - 1];
    for (int i = 1; i < m; i++)
        for (int j = 1; j < n; j++)// 递推公式
            grid[i][j] = min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
    return grid[m - 1][n - 1];
}

Python:
def minPathSum(self, grid: List[List[int]]) -> int:
    m, n = len(grid), len(grid[0])
    for i in range(1, m):  # 第一列只能从上面下来
        grid[i][0] += grid[i - 1][0]
    for i in range(1, n):  # 第一行只能从左边过来
        grid[0][i] += grid[0][i - 1]
    for i in range(1, m):
        for j in range(1, n):  # 递推公式
            grid[i][j] = min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j]
    return grid[m - 1][n - 1]


笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档


继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存