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

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

示例:

输入:

[
[,,],
[,,],
[,,]
]
输出:
解释: 因为路径 →→→→ 的总和最小。

解题思路:

这道题目也是一个经典的动态规划题目,首先题目中说明了:每次只能向下走或者向右移动一步,因此我们可以建立一个dp矩阵,大小为m行n列,其中dp[i][j]表示从左上角[0][0]位置到[i][j]位置的最小路径和。因此我们可以得到递推式为:

dp[i][j]=min(dp[i-1][j], dp[i][j-1])+grid[i][j]

注意i=0或者j=0时,即第一行或者第一列,数组会越界,因此需要进行判断。对于i=0的情况:dp[i][j]=dp[i][j-1]+grid[i][j], j=0的情况同理可得!
当我们得到递推式以后,就可以很快的写出代码了,主要是注意不要越界就好了,并且由于我们代码循环中没有判断i,j同时为零的情况,因此需要对其进行初始化!

class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[].size();
vector<vector<int>> dp(m, vector<int>(n, ));
dp[][] = grid[][];
for(int i = ; i < m; i++){
for(int j = ;j < n; j++){
if(i == && j != ) dp[i][j] = dp[i][j-] + grid[i][j];
if(i != && j == ) dp[i][j] = dp[i-][j] + grid[i][j];
if(i != && j != ){
dp[i][j] = min(dp[i-][j], dp[i][j-]) + grid[i][j];
}
}
}
return dp[m-][n-];
}
};

同时,我们可以将上面的代码进行优化处理,不使用额外的空间dp矩阵,而是将dp矩阵建立在原数据grid上,但我以为这样会改变原数据,工程中不可以,但优化空间还是OK的!

class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[].size();
for(int i = ; i < m;i++){
for(int j = ; j < n;j++){
if(i == && j != ) grid[i][j] += grid[i][j-];
if(i != && j == ) grid[i][j] += grid[i-][j];
if(i * j != )
grid[i][j] += min(grid[i][j-], grid[i-][j]);
}
}
return grid[m-][n-];
}
};

【LeetCode】最小路径和的更多相关文章

  1. [LeetCode] Minimum Path Sum 最小路径和

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  2. [LeetCode] 64. Minimum Path Sum 最小路径和

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  3. LeetCode 64. 最小路径和(Minimum Path Sum) 20

    64. 最小路径和 64. Minimum Path Sum 题目描述 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明: 每次只能向下或 ...

  4. Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum)

    Leetcode之动态规划(DP)专题-64. 最小路径和(Minimum Path Sum) 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. ...

  5. leetcode 64. 最小路径和 动态规划系列

    目录 1. leetcode 64. 最小路径和 1.1. 暴力 1.2. 二维动态规划 2. 完整代码及执行结果 2.1. 执行结果 1. leetcode 64. 最小路径和 给定一个包含非负整数 ...

  6. LeetCode(120):三角形最小路径和

    Medium! 题目描述: 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] ...

  7. LeetCode(64):最小路径和

    Medium! 题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [   [1 ...

  8. leetcode 120. 三角形最小路径和 JAVA

    题目: 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和 ...

  9. LeetCode 120——三角形最小路径和

    1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的 ...

  10. LeetCode 三角形最小路径和

    给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11 ...

随机推荐

  1. 1-3SpringBoot之Controller使用

    Controller的使用 @Controller 处理http请求 @RestController Spring4之后新加的注解,原来返回json需要@ResponseBody配合@Controll ...

  2. 关于页面跳转之后获取不到session数据的问题

    暂时的解决方法有两种,亲测有效: 方法一:  将页面跳转方式由a标签改为请求转发request.getRequestDispatcher("stu_list.jsp").forwa ...

  3. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:包装类

    public class WrapperDemo01{ public static void main(String args[]){ int x = 30 ; // 基本数据类型 Integer i ...

  4. vi/vim编辑器基本操作

    一.vi/vim的三种模式 vi编辑器有三种模式:命令模式(command mode).插入模式(Insert mode).底行模式(last line mode). 就是你直接用命令(vi  文件名 ...

  5. jmeter用Stepping Thread Group 递增并发数

    jmeter安装插件Stepping Thread Group 如图所示设置的时候,本以为是每2秒 按 1 2 3 4 递增的,总共请求应该是10个,可是运行后却请求了几十个. 这个是有关线程数是否就 ...

  6. MySQL查询事务 杀死事务

    遇到 com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock 查询: SELECT * FROM inf ...

  7. 侯捷C++学习(一)

    //c++学习//标准库非常重要//要规范自己的代码complex c1(2,1);complex c2;complex* pc = new complex(0,1);string s1(" ...

  8. 说说mysql和oracle他门的分页查询,分别是怎么实现的?

    MySQL: 1.MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了. 2.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两 ...

  9. 微信小程序-发送模板消息

    1 添加一个小程序的消息模板,获取到模板id,存储到数据库中,方便以后修改调用 2. https://developers.weixin.qq.com/miniprogram/dev/api-back ...

  10. 真香的flex弹性布局

    如何实现一个左中右的布局 在flex出现之前 #box{ color: white; } #left{ float: left; width: 30%; background-color: red; ...