美文网首页程序员
LeetCode:最小路径和

LeetCode:最小路径和

作者: 李海游 | 来源:发表于2020-04-20 20:01 被阅读0次

    64. 最小路径和

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
    说明:每次只能向下或者向右移动一步。
    示例:
    输入:
    [
    [1,3,1],
    [1,5,1],
    [4,2,1]
    ]
    输出: 7
    解释: 因为路径 1→3→1→1→1 的总和最小。

    思路:

    一个结点只能往右或者往下走,那么该结点到右下角的最短路径等于其本身加上 该结点右面结点到右下角的最短路径 与 该结点下面结点到右下角的最短路径。
    边界条件:

    • 当前结点为右下角结点时,返回右下角结点的值
    • 最后一行的结点只能往右走,该结点的最短路径等于该结点右面结点到右下角的最短路径
    • 最后一列的结点只能往下走,该结点的最短路径等于该结点下面结点到右下角的最短路径
    递归代码
    class Solution {
    public:
        int minPathSum(vector<vector<int>>& grid) {
            if (grid.size() == 0 || grid[0].size() == 0)
                return 0;
            return help(grid, 0, 0);
        }
    
        int help(vector<vector<int>>& grid, int i, int j)
        {
            if (i == grid.size() - 1 && j == grid[0].size() - 1)
                return grid[i][j];
            if (i == grid.size() - 1)
                return grid[i][j] + help(grid, i, j + 1);
            if (j == grid[0].size() - 1)
                return grid[i][j] + help(grid, i + 1, j);
            int right = help(grid, i, j + 1);
            int down = help(grid, i + 1, j);
            return grid[i][j] + (right<down ? right : down);
        }
    };
    

    动态规划代码

    class Solution {
    public:
        int minPathSum(vector<vector<int>>& grid) {
            if (grid.size() == 0 || grid[0].size() == 0)
                return 0;
            int row = grid.size() - 1, col = grid[0].size() - 1;
            for (int i = col - 1; i >= 0; --i)  //初始化最后一行
            {
                grid[row][i] = grid[row][i] + grid[row][i + 1];
            }
            for (int i = row - 1; i >= 0; --i)  //初始化最后一列
            {
                grid[i][col] = grid[i][col] + grid[i + 1][col];
            }
            for (int i = row - 1; i >= 0; --i)  //一般元素
            { 
                for (int j = col - 1; j >= 0; --j)
                {
                    grid[i][j] = grid[i][j] + (grid[i + 1][j]<grid[i][j + 1] ? grid[i + 1][j] : grid[i][j + 1]);
                }
            }
            return grid[0][0];
        }
    };
    

    相关文章

      网友评论

        本文标题:LeetCode:最小路径和

        本文链接:https://www.haomeiwen.com/subject/tmvpbhtx.html