前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【leetcode刷题】20T30-最小路径和

【leetcode刷题】20T30-最小路径和

作者头像
木又AI帮
发布2020-03-12 18:10:25
2370
发布2020-03-12 18:10:25
举报
文章被收录于专栏:木又AI帮木又AI帮

【题目】

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

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

代码语言:javascript
复制
示例:
输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

【思路】

这道题和上次分享的【20T29-不同路径 II】非常类似,也是动态规划题目。

递归公式是:dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]。

当然可以转换使用一维数组:dp[j] = min(dp[j], dp[j - 1]) + grid[i][j]。

【代码】

python版本

代码语言:javascript
复制
class Solution(object):
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # dp[i][j] = min(dp[i-1][j], dp[i][j-1])
        if len(grid) == 0 or len(grid[0]) == 0:
            return 0
        dp = [grid[0][0]] * len(grid[0])
        for j in range(1, len(grid[0])):
            dp[j] = dp[j - 1] + grid[0][j]

        for i in range(1, len(grid)):
            dp[0] += grid[i][0]
            for j in range(1, len(grid[0])):
                dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]
        return dp[-1]

C++版本

代码语言:javascript
复制
class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        if(grid.size() == 0 || grid[0].size() == 0)
            return 0;
        vector<int> dp(grid[0].size(), grid[0][0]);
        for (int j = 1; j < grid[0].size(); j++)
            dp[j] = dp[j - 1] + grid[0][j];

        for (int i = 1; i < grid.size(); i++) {
            dp[0] = dp[0] + grid[i][0];
            for (int j = 1; j < grid[0].size(); j++) {
                dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];
            }
        }
        return dp.back();
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 木又AI帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档