列表

详情


BM68. 矩阵的最小路径和

描述

给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。

数据范围: ,矩阵中任意值都满足
要求:时间复杂度

例如:当输入[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]时,对应的返回值为12,
所选择的最小累加和路径如下图所示:

示例1

输入:

[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]

输出:

12

示例2

输入:

[[1,2,3],[1,2,3]]

输出:

7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 324KB, 提交时间: 2022-01-25

class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型
     */
    int minPathSum(vector<vector<int> >& matrix) {
        // write code here
        
        int rowls = matrix.size();
        int cols = matrix[0].size();
        
        for (int i =0;i< rowls;i++)
        {
            for(int j=0;j< cols;j++)
            {
                if (i==0 && j>0) 
                    matrix[i][j] =  matrix[i][j] + matrix[i][j - 1];
                else if (j == 0 && i> 0)
                {
                    matrix[i][j] =  matrix[i -1][j] + matrix[i][j];
                }
                else{
                    if (i ==0 && j==0) continue;
                    int min_v = matrix[i][j-1] > matrix[i-1][j]?matrix[i-1][j]:matrix[i][j-1];
                    matrix[i][j] = matrix[i][j] + min_v;
                }
            }
        }
        
        return matrix[rowls -1][cols-1];
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 344KB, 提交时间: 2021-04-04

class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型
     */
    int minPathSum(vector<vector<int> >& matrix) {
        // write code here
        int n = matrix.size();
             int m = matrix[0].size();
             for(int i = 1 ; i < n ; i++){matrix[i][0] = matrix[i-1][0]+ matrix[i][0];}
             for(int j = 1 ; j < m ; j++){matrix[0][j] = matrix[0][j-1]+  matrix[0][j];}
             for(int i = 1 ; i < n ; i++)
             {
                   for(int j = 1 ; j < m ; j++)
                   {
                           matrix[i][j] = min(matrix[i-1][j],matrix[i][j-1])+matrix[i][j];
                   }
             }
      
             return matrix[n-1][m-1];

    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2021-04-30

class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型
     */
    int minPathSum(vector<vector<int> >& matrix) {
        int m = matrix.size(), n = matrix[0].size();
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (i == 0 && j == 0)
                continue;
            if (i == 0) {
                //第一行只能从左边走过来
                matrix[i][j] += matrix[i][j - 1];
            } else if (j == 0) {
                //第一列只能从上面走下来
                matrix[i][j] += matrix[i - 1][j];
            } else {
                //递推公式,取从上面走下来和从左边走过来的最小值+当前坐标的值
                matrix[i][j] += min(matrix[i - 1][j], matrix[i][j - 1]);
            }
        }
    }
    return matrix[m - 1][n - 1];  
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2021-04-04

class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型
     */
    int minPathSum(vector<vector<int> >& matrix) {
        // write code here
        int m=matrix.size();
        int n=matrix[0].size();  
        int dp[m][n];
        dp[0][0]=matrix[0][0];
        for(int i=1;i<n;i++){
            dp[0][i]=matrix[0][i]+dp[0][i-1];
        }
        for(int j=1;j<m;j++){
            dp[j][0]=matrix[j][0]+dp[j-1][0];
        }
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                dp[i][j]=matrix[i][j]+min(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[m-1][n-1];
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2021-04-25

class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型
     */
    int minPathSum(vector<vector<int> >& matrix) {
        // write code here
        //动态规划,需要用到辅助表,辅助表表示从(0,0)点到(i,j)经过的最短路径之和
        //关键在于生成辅助表:
        /*
        对辅助表的第一行所有位置来说,即(0,j)(0≤j<N),
        从(0,0)位置走到(0,j)位置只能向右走,
        所以(0,0)位置到(0,j)位置的路径和就是m[0][0..j]这些值的累加结果。
        同理,对于辅助表的第一列的所有位置来说,同第一行的处理方式相同。
        对于除了第一列和第一行的其他所有辅助表元素来说,(i,j)都由
        左边位置(i-1,j)和上边位置(i,j-1)两者中的最小值和(i,j)相加得到
        */
        int raw=matrix.size();//二维矩阵的行数
        int column=matrix[0].size();//二维矩阵的列数
        //对距离矩阵的列进行处理
        for(int i=1;i<raw;++i)
        {
            matrix[i][0]=matrix[i-1][0]+matrix[i][0];
        }
        for(int i=1;i<column;++i)
        {
            matrix[0][i]=matrix[0][i-1]+matrix[0][i];
        }
        for(int i=1;i<raw;++i)
        {
            for(int j=1;j<column;++j)
            {
                matrix[i][j]=min(matrix[i-1][j],matrix[i][j-1])+matrix[i][j];
            }
        }
        return matrix[raw-1][column-1];
    }
};

上一题