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

秋招算法备战第39天 | 62.不同路径、63. 不同路径 II

62. 不同路径 - 力扣(LeetCode)

按照动态规划五部曲走,非常清晰

class Solution:def uniquePaths(self, m: int, n: int) -> int:dp = [[0 for _ in range(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[-1][-1]

上面的代码对于数据定义和初始化还能优化,具体如下

def uniquePaths(m, n):# 初始化二维数组dpdp = [[1] * n for _ in range(m)]# 遍历每个点计算到达该点的路径数量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]

63. 不同路径 II - 力扣(LeetCode)

和上一题不一样的地方在于初始化以及根据条件不同有不同的状态转移公式

class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:m = len(obstacleGrid)n = len(obstacleGrid[0])dp = [[0]*n for _ in range(m)]for i in range(m):if obstacleGrid[i][0] == 1:breakdp[i][0] = 1for j in range(n):if obstacleGrid[0][j] == 1:breakdp[0][j] = 1for i in range(1, m):for j in range(1, n):if obstacleGrid[i][j] == 1:continueif obstacleGrid[i-1][j] == 0 and obstacleGrid[i][j-1] == 0:dp[i][j] = dp[i-1][j] + dp[i][j-1]elif obstacleGrid[i-1][j] == 1 and obstacleGrid[i][j-1] == 0:dp[i][j] = dp[i][j-1]elif obstacleGrid[i-1][j] == 0 and obstacleGrid[i][j-1] == 1:dp[i][j] = dp[i-1][j]return dp[-1][-1]

后面发现状态转移方程可以简化,在obstacleGrid[i][j] == 0的情况下,不需要再对上左两个方向的障碍物做判断,直接相加即可,因为障碍物点对应的dp值一定为0,代码如下

def uniquePathsWithObstacles(obstacleGrid):if not obstacleGrid or obstacleGrid[0][0] == 1:return 0m, n = len(obstacleGrid), len(obstacleGrid[0])# 初始化dp数组为0dp = [[0] * n for _ in range(m)]dp[0][0] = 1# 初始化第一行for i in range(1, m):dp[i][0] = dp[i-1][0] if obstacleGrid[i][0] == 0 else 0# 初始化第一列for j in range(1, n):dp[0][j] = dp[0][j-1] if obstacleGrid[0][j] == 0 else 0# 遍历每个点计算到达该点的路径数量for i in range(1, m):for j in range(1, n):if obstacleGrid[i][j] == 0:dp[i][j] = dp[i-1][j] + dp[i][j-1]return dp[m-1][n-1]

总结

今天的题目开始能够更加直观地体会到按照动态规划五部曲分析题目的意义

http://www.lryc.cn/news/113309.html

相关文章:

  • Docker网络模型使用详解(2)Docker网络模式
  • Docker DCT
  • 【owt】erzio的handler和pipeline
  • Dockerfile构建mysql
  • QT-如何生成唯一ID
  • Go语言基础: Switch语句、Arrays数组、Slices切片 详细教程案例
  • 从URL取值传给后端
  • API接口用例生成器
  • 最新AI创作系统ChatGPT源码V2.5.8/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt+MJ以图生图+思维导图生成!
  • 【Vxworks】映射物理地址为虚拟地址,并获取此地址的存放值
  • C/C++可变参数列表
  • MongoDB基本命令使用
  • uniapp 微信小程序 上下滚动的公告通知(只取前3条)
  • OSPF在MGRE上的实验
  • 什么样的跨网文件安全交换系统 可实现安全便捷的文件摆渡?
  • C语言memset函数的作用
  • 暑假刷题第23天--8/7
  • Double DQN缓解动作价值的高估问题
  • 【C#学习笔记】内存管理
  • 面试之快速学习c++11- 列表初始化和 lambda匿名函数的定义
  • CI/CD—Docker初入门学习
  • 多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法
  • 瑞吉外卖系统05
  • D455+VINS-Fusion+surfelmapping 稠密建图(三)
  • rv1109/1126 rknn 模型部署过程
  • Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP
  • --binlog-row-event-max-size
  • Jmeter命令行运行实例讲解
  • pl/sql函数如何返回多行数据?在线等......
  • Ubuntu Find命令详解