当前位置: 首页 > news >正文

LeetCode刷题记录----62.不同路径(Medium) - 详解

2025/9/26

题目(Medium):

62.不同路径(Medium)


我的思路:

模式识别:走到[m-1,n-1]就需要先走到[m-2,n-1]或者[m-1,n-2]的位置,而走到上述两个位置也需要同样往前推导,因此主问题和子问题有相同的结构和状态含义 --> 动态规划

因为是动态规划,所以我们要考虑各个状态以及状态的转移方程

显然需要对每个格子记录状态,所以我们用二维数组:

dp[i, j]:到达[i, j]位置的不同路径数

状态转移方程:dp[i, j] = dp[i-1, j] + dp[i, j-1]        【因为每次从左边或者上边的格子到达[i,j]一定只有一种方法】

初始状态:现在到达第一行或者第一列的格子都一定只有一条路径,所以都初始化为1

具体代码如下:

public class Solution {public int UniquePaths(int m, int n) {//第一行/第一列的格子显然都只有一种方式到达int[,] dp = new int[m, n];for(int j = 0; j < n; j++)dp[0, j] = 1;for(int i = 0; i < m; i++)dp[i, 0] = 1;//其他格子要到达,就一定要先到达她的左边,或者上边的格子。for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){dp[i, j] = dp[i-1, j] + dp[i, j-1];}}return dp[m-1, n-1];}
}

时间复杂度:O(MN)

空间复杂度:O(MN)


优化思路:

1.压缩为一维动态规划

在上面的转移方程:dp[i, j] = dp[i-1, j] + dp[i, j-1] 中,我们可以看出来当前第 i 行,第j列的dp值只和它这一行的j-1列,以及上一行的j列元素有关。

因此我们可以考虑把他压缩为一维的,这样每次在计算新dp[j]的时候,都是计算最新一行的dp[j]值,同时对于还没计算的位置相当于保留了上一行的dp[j]的值

新转移方程:dp[j] = dp[j] + d[j-1] 

初始化:全部为1,因为第一行全部为1

翻译:当前行的dp[j] = 上一行的dp[j] + 当前行的dp[j-1]

具体代码如下:

public class Solution {public int UniquePaths(int m, int n) {//第一行/第一列的格子显然都只有一种方式到达int[] dp = new int[n];Array.Fill(dp, 1);//其他格子要到达,就一定要先到达她的左边,或者上边的格子。for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){//dp[i, j] = dp[i-1, j] + dp[i, j-1];dp[j] += dp[j-1];       //可以压缩为一维的,因为可以看到每一行的状态只与这一行以及她的上一行有关}}return dp[n-1];}
}

时间复杂度:O(MN)

空间复杂度:O(N)

2.组合数

我们还可以通过数学原理 ,要到达m行,n列的位置,一共需要移动的次数为m+n-2次 。其中需要向下移动的次数是m-1次,而题目要求的相当于就是在这m+n -2次中,选取m-1种不同的下移方案。

因此可以用该组合数公式来进行计算(公式图片来自于LeetCode官方题解)

其中我们通过这里来下手,进行累乘计算(下面展示部分累乘过程)

 n/1 ,(n /1) * (n+1/2),(n/1) * (n+1/2) * (n+2/3) ...以此类推到最终答案值

因此我们可以用变量 x表示范围n ~ n + m -2 的分子,用变量y 表示范围1 ~ m-1的分母

具体代码如下:

public class Solution {public int UniquePaths(int m, int n) {//还可以计算组合数//一共要移动m+n-2次,其中存在m-1种往下移动的次数long ans = 1;long x, y;for(x = n, y = 1; y < m; x++, y++){ans = ans * x/ y;       //存在一个推导公式}return (int)ans;}
}

时间复杂度:O(M)

空间复杂度:O(1)

注意:这里累乘的计算过程种有可能会出现超过int的上限的数字,所以用long来存储

这个来自LeetCode的一个评论区的补充解释,忘记了可以回来看一眼


总结:

①对于路径数总和问题,如果存在确定的移动规则,那我们可以很简单地通过动态规划来解决。

②当状态转移方程种发现当前这一行的状态可以仅由当前行的状态和上一行的状态得到的时候,可以考虑压缩为一维动态规划

③你永远可以相信数学原理的力量

http://www.zskr.cn/news/14971.html

相关文章:

  • 「补充篇」在Cloudflare上设置并更新SRV记录
  • 2025电源适配器权威推荐榜:高效稳定、安全耐用的优质品牌之
  • 「LUCKY STUN穿透」IPv4和IPv6分离重定向
  • 如何设计出优秀、健壮且易于维护的API——关于HTTP状态码与业务逻辑状态码的处理 - 浪矢
  • 做题记录(Part 1. 基础算法)
  • 实用指南:零基础学AI大模型之Prompt提示词工程
  • 详细介绍:2023 美赛C Predicting Wordle Results(上)
  • 一阶逻辑及其变体在自然语言深层语义分析中的作用、挑战与未来启示 - 实践
  • 《电路基础》第六章学习笔记
  • 利用IOT-Tree消息流【标签读写】功能详细说明
  • 2025.10.2 2024CCPC重庆
  • 命令行实用技巧
  • 2025无锡网咖权威推荐榜:停车便利体验佳,畅享上网好时光
  • 教培公司 —— 讲课评分表
  • 2025无锡黄金上门回收公司权威推荐榜:专业估价与诚信服务口碑之选
  • P2141 [NOIP 2014 普及组] 珠心算测验
  • 2025.10 做题笔记
  • NOIP 集训日记 2.0
  • 深圳网站建设公司权威推荐榜:专业定制与创新设计口碑之选
  • 详细介绍:AI 动画视频创作:技巧升级与行业未来趋势
  • 华为手机鸿蒙系统 4.2 / 4.3 安装谷歌框架的详细教程 - 教程
  • 2025黄金回收公司权威推荐榜:专业估价与诚信服务口碑之选
  • 2025喷雾干燥厂家TOP企业品牌推荐排行榜,无锡,常州喷雾干燥,低温,压力,气流,离心式,压力式喷雾干燥,喷雾干燥塔,设备,装置公司推荐!
  • 2025无锡考编培训品牌机构公司TOP5推荐:公考培训/事业单位考编/央企国企考编培训机构:权威师资与高效课程深度解析
  • UNIX下C语言编程与实践6-Make 工具与 Makefile 编写:从基础语法到复杂计划构建实战
  • 01delphi10.3下PDFium5.8的提取文本
  • 实用指南:Redis 哈希槽解析
  • 深入解析:ROS2学习研究版本推荐:Jazzy Jalisco(LTS长期支持版)AI版本251001
  • 2025热熔胶厂家 TOP 企业品牌推荐排行榜,书刊装订,珍珠棉,纸箱包装,环保,书本,试卷,票据,平摊,胶版纸,铜版纸热熔胶公司推荐!
  • cyberstrikelab-lab14