62.不同路径
https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html
视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu
- 考点
- 二维动规
- 我的思路
- 当前位置的路线总数为左位置和上位置的路线数之和
- 视频讲解关键点总结
- 我的思路没问题,但有几个细节问题:
- 1,二维列表的定义(具体见代码书写问题)
- 2,初始化,由于题目规定只能向下或向右走,因此最上面一行和最左面一列的所有位置均只有一条路线,因此均初始化为1
- 我的思路没问题,但有几个细节问题:
- 我的思路的问题
- 细节有问题
- 代码书写问题
- 二维列表的定义借助列表生成式,具体见我另一篇文章
- 可执行代码
class Solution:def uniquePaths(self, m: int, n: int) -> int:dp = [[0] * n for _ in range(m)]for i in range(m):dp[i][0] = 1for j in range(n):dp[0][j] = 1for i in range(1, m):for j in range(1, n):dp[i][j] = dp[i - 1][j] + dp[i][j - 1]return dp[m - 1][n - 1]
*63. 不同路径 II
https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.html
视频讲解:https://www.bilibili.com/video/BV1Ld4y1k7c6
- 考点
- 二维动规
- 障碍物处理
- 我的思路
- 和上一题不同之处有二
- 一是初始化,当遇到石头的时候,后面所有位置均保持初始值0即可
- 二是递推公式,需要额外添加条件判断,当当前位置没有石头的时候才执行左和上位置路线数的求和赋值,否则直接跳过(保持0初始值)
- 视频讲解关键点总结
- 我的原思路中代码写得复杂了,有不少逻辑可以剪枝,我已经在我的思路中展示了剪枝后的思路
- 我的思路的问题
- 原思路代码逻辑冗余,可以剪枝
- 代码书写问题
- 无
- 可执行代码
class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:dp = [[0] * len(obstacleGrid[0]) for _ in range(len(obstacleGrid))]for i in range(len(obstacleGrid[0])):if obstacleGrid[0][i] != 1:dp[0][i] = 1else:breakfor j in range(len(obstacleGrid)):if obstacleGrid[j][0] != 1:dp[j][0] = 1else:breakfor j in range(1, len(obstacleGrid)):for i in range(1, len(obstacleGrid[0])):if obstacleGrid[j][i] == 1:continuedp[j][i] = dp[j - 1][i] + dp[j][i - 1]return dp[len(obstacleGrid) - 1][len(obstacleGrid[0]) - 1]