Leetcode题62、不同路径(Python题解)微软面试题

本篇博客详细介绍了LeetCode第62题‘不同路径’的Python解决方案,重点讲解了如何使用动态规划进行求解。首先,博主阐述了动态规划的基本思想,然后通过递归思路分析问题,给出递推公式,并讨论了如何从底部和右侧开始优化计算。接着,博主提出空间优化策略,从O(n*2)减少到O(n),并展示了具体的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不同路径系列题包含3道:
不同路径II
不同路径III

问题
在这里插入图片描述

在这里插入图片描述

题目来源:力扣(LeetCode)

leetcode62.不同路径

难度:中等

分析
经典的动态规划题。动态规划与递归紧密相连,递归是自顶向下,不断压栈,压到最后一层之后开始向回计算。动态规划是直接从底层向上计算,省去了压栈的空间和重复计算的时间。递归可以用memo优化时间。

动态规划步骤:
第一步,先找状态空间!!这很重要,找到状态空间表示问题所有的状态。
第二步写递推公式!
第三步写base case!

本题递归的思路:
从起点出发,第一步有几种走法?两种:向右和向下。
两种情况是否有重合?无
两种情况是否有遗漏?无
因此总的路径数就是起点右边和下边框出发走过的路径数之和。重复此计算直到到达终点。

本题DP的思路:
递归思路可以直接搬到DP上写,递推公式为dp[i - 1][j - 1] = dp[i] [j - 1] + dp[i - 1][j], base case 是矩阵的最下端一行和最右端一列初始化为1.因为这些格子只有一个方向的走法。

此处为了自底向上思考也可以从终点开始考虑。
到达终点,有几种情况可到达?两种:左边和上边。
两种情况是否有重合?无
两种情况是否有遗漏?无
因此总的路径数就是到达终点左边和终点上边框的路径数之和。从起点开始计算到达每一个点的路径数,直到计算到终点。

递推公式为dp[i][j] = dp[i] [j - 1] + dp[i - 1][j], base case 是矩阵的最上端一行和最左端一列初始化为1.因为这些格子只有一个方向能到达。

优化
时间上无法优化,没有贪心的策略,每一步必须计算到。
空间上可以进一步优化。我们注意到,每一次计算只需要左边和上边的两个值。只要我们保证直到矩阵里的两行数据,计算就可以不断地进行下去。因此O(n*2)可以简化到O(2n)。
进一步地,我们发现在计算的时候,由于我们需要左边和上边的值来更新当前格子,如果用只用一行数据来计算,那么在未更新当前格子值之前,左边格子值是前一步已经更新的值,符合我们的需要;当前格子值是上一行的值,符合我们的需要,所以空间可以简化到O(n)。

解决方法
1:二维DP

递推公式为dp[i][j] = dp[i] [j - 1] + dp[i - 1][j],ba

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值