【LeetCode】64. 最小路径和

news/2024/11/29 20:46:14/

64. 最小路径和(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法一:常规动态规划

  1. 思路

    • 定义一个二维 dp 数组,其中 dp[i][j]表示从左上角开始到(i, j)位置的最优路径的数字和。
    • 因为每次都只能向下或者向右移动,所以很容易发现 dp数组第一行的元素一定只能从左边出发,所以第一行的元素初始化为 dp[0][i] = dp[0][i-1] + grid[0][i] ;
    • 第一列的元素一定只能从上边出发,所以第一列的元素初始化为 dp[j][0] = dp[j-1][0] + grid[j][0]
    • 其余元素,可能从上边出发,也可能从左边出发,因此我们需要比较得到二者中较小的那个值,作为最优路径,所以状态转移方程为 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
  2. 代码

    class Solution {
    public:int minPathSum(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();vector<vector<int>> dp(m, vector<int>(n, 0));dp[0][0] = grid[0][0];// 对第一列初始化for(int i=1; i<m; ++i){dp[i][0] = dp[i-1][0] + grid[i][0];}// 对第一行初始化for(int j=1; j<n; ++j){dp[0][j] = dp[0][j-1] + grid[0][j];}for(int i=1; i<m; ++i){for(int j=1; j<n; ++j){dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];}}return dp[m-1][n-1];}
    };
    
  3. 收获

    • 这道题蛮简单的,自己思考做出。

方法二:状态压缩

  1. 思路

    • 因为 dp 矩阵的每一个值只和左边和上面的值相关,所以我们可以使用空间压缩将 dp 数组压缩为一维。对于第 i 行,在遍历到第 j 列的时候,第 j-1 列已经计算过了,所以 dp[j-1] 代表原先对应的 dp[i][j-1] 的值;而 dp[j] 待更新,当前存储的值是在 i-1 行的时候计算的,所以代表 dp[i-1][j] 的值。
  2. 代码

    class Solution {
    public:int minPathSum(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();vector<int> dp(n, 0);for(int i=0; i<m; ++i){for(int j=0; j<n; ++j){if(i == 0 && j == 0){dp[j] = grid[i][j];}else if(i == 0){// 第一行dp[j] = dp[j-1] + grid[i][j];}else if(j == 0){// 第一列dp[j] = dp[j] + grid[i][j];}else{dp[j] = min(dp[j], dp[j-1]) + grid[i][j];}}}return dp[n-1];}
    };
    
  3. 收获

    • 很少接触空间压缩,看了思路不太理解,模拟一下就很好懂了。

http://www.ppmy.cn/news/58438.html

相关文章

Tkinter正则表达式工具

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入tkinter和re模块&#x1f3f3;️‍&#x1f308; 2. 设置窗口居中&#x1f3f3;️‍&#x1f308; 3. 设置lable、text、button布局&#x1f3f3;️‍&#x1f308; 4. 设置下拉列表框&#x1f3f3;️‍&#x1f308; 5. 清空文…

【python】python 操作sqlite 日期的工具类

在Python中,可以使用datetime模块来操作日期和时间。该模块提供了许多方法和属性,使得我们可以方便地创建、比较和格式化日期和时间对象。 在SQLite中,日期和时间被存储为文本字符串,格式为YYYY-MM-DD(日期)和HH:MM:SS.SSS(时间),其中SS.SSS表示秒和毫秒。SQLite还提…

验证二叉搜索树-递归双指针法

1题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a…

96. 不同的二叉搜索树

目录 1、题目描述 2、思路&#xff1a;动态规划 2.2、确定递推公式 2.3、dp数组初始化 2.4、确定遍历顺序 3、C实现如下 1、题目描述 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜…

Mybatis读取和存储json类型的数据

目录 一、测试使用JSONObject来获取json二、设置TableName的autoResultMap为true&#xff0c;TableField的typeHandler为JacksonTypeHandler.class三、设置xml当中的resultMap四、JacksonTypeHandler讲解五、新增假如是JSONObject异常问题六、遇到转义的问题 不管数据库当中是以…

ospf扩展配置—认证、沉默接口、加快收敛、缺省路由

目录标题 认证接口认证区域认证虚链路认证 沉默接口加快收敛缺省路由3类缺省5类缺省7类缺省 总结 认证 在直连的邻居或邻接之间&#xff0c;配置身份核实秘钥来保障邻居、邻接间数据沟通的安全性 接口认证 在这连连接的接口上配置 [r6-GigabitEthernet0/0/1]ospf authentic…

生成C++工程的UML类图和类继承关系图

简介 在进行软件开发时&#xff0c;了解代码结构和关系、类之间的继承关系以及类内部的成员函数和变量定义是非常重要的。为此&#xff0c;我们可以使用Doxygen和Graphviz工具来生成UML类图和类集成关系图。 Doxygen是一个用于从注释的C源代码中生成文档的工具&#xff0c;支…

Ubuntu---mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法

查看mysql版本&#xff1a; 安装完成后&#xff0c;登录mysql的时候就出现了如下错误&#xff1a; 因为安装的过程中没让设置密码&#xff0c;可能密码为空&#xff0c;但无论如何都进不去mysql。 下面是处理过程&#xff1a; Step1&#xff1a;修改mysqld.cnf配置文件 在ubun…