1 leetcode62.不同路径
文章链接:代码随想录
视频链接:动态规划中如何初始化很重要!| LeetCode:62.不同路径哔哩哔哩bilibili
思路:首先就不知道dp的含义应该如何定义了
1.1 视频后的思路
动态规划五部曲:
-
dp[i][j]的含义是表示第i行第j列的格子的方法和 -
动态规划的表达式:这个格子的和和哪些值有关呢,首先是他的上面一个格子和左边格子的数有关,即二者相加即可
-
初始值的定义:就是确定哪些是固定的,就是第一行和第一列的数值,因为这两个数值不管怎么走都只有一种方法
-
确定遍历顺序:就是遍历每一个格子的方法
-
打印dp值:演示的时候可以打印
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] =1 for j in range(n): dp[0][j] = 1 for 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]
1.2 递归的方法
其实看了思路以后发现这个也很简单
class Solution: def uniquePaths(self, m: int, n: int) -> int: if m == 1 or n == 1: return 1 return self.uniquePaths(m-1,n)+self.uniquePaths(m,n-1)
1.3 本题小结
-
这道题目主要是没想到其值和格子的位置有关,没有找到这个规律
-
dp[i]的值如何确定在动态规划中非常重要,这个值确实很多时候很难想到
2 leetcode 63. 不同路径 II
题目链接:63. 不同路径 II - 力扣(LeetCode)
文章链接:代码随想录
视频链接:动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II哔哩哔哩bilibili
思路:跟上一题差不多吧,但是我写的代码只能满足部分测试集的要求,没有办法满足全部的测试集数据
2.1 自己的方法
虽然在[[0]]这种情况下报错了,但是还是记录一下自己的方法,后来发现改了很多还都挺有问题的,换个角度吧,看视频
class Solution: def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: for i in range(len(obstacleGrid)): if obstacleGrid[i][0] ==0: obstacleGrid[i][0] = 1 else: obstacleGrid[i][0] = 0 for j in range(len(obstacleGrid[1])): if obstacleGrid[0][j] == 0: obstacleGrid[0][j] = 1 else: obstacleGrid[0][j] = 0 for m in range(1,len(obstacleGrid)): for n in range(1,len(obstacleGrid[1])): if obstacleGrid[m][n] ==1: obstacleGrid[m][n] = 0 else: obstacleGrid[m][n] = obstacleGrid[m-1][n] + obstacleGrid[m][n-1] return obstacleGrid[len(obstacleGrid)-1][len(obstacleGrid[1])-1]
2.2 视频后更正
真的就是懒会出问题,其实定义一个同样长度的二维数组问题就解决了,,,
class Solution: def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: m = len(obstacleGrid) n = len(obstacleGrid[0]) if obstacleGrid[0][0] ==1 or obstacleGrid[m-1][n-1] ==1: return 0 dp = [[0]*n for _ in range(m)] for i in range(m): if obstacleGrid[i][0] == 0: dp[i][0] =1 else: break for j in range(n): if obstacleGrid[0][j] == 0: dp[0][j] =1 else: break for x in range(1,m): for y in range(1,n): if obstacleGrid[x][y] ==1: continue dp[x][y] = dp[x-1][y]+dp[x][y-1] return dp[m-1][n-1]
2.3 本题小结
-
其实这道题建立一个新的二维数组问题全都解决了,我就是在那儿倔强,不建立,就一直是全局解,找不到最优解,看来不能偷懒
-
这道题真的就和上面一道一模一样,就是不要乱加,加多了反而会犯错
3 今日小结
-
这两道题难度,首先就是dp[i]的定义,对于这种定义问题确实对我而言有些难想,希望做多了我会变得更好吧
-
第二题,真的与其在原二维数组混乱,不如直接新建一个统计,更加明确这个值
-
希望以后我的思路会越来越清晰
8931

被折叠的 条评论
为什么被折叠?



