【Leetcode刷题Python】63. 不同路径 II

简介: LeetCode 63题 "不同路径 II" 的Python解决方案,使用动态规划算法计算在有障碍物的网格中从左上角到右下角的不同路径数量。

1 题目

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

2 解析

状态:从左上角到右下角不同的路径数量
状态转移:

  • 在第一行时,即i=0,j>0,只能当前状态只能来自后一列的状态,
    $$f(x)=f(i,j−1)$$
  • 在第一列时,即i>0,j=0,只能当前状态只能来自后一行的状态
    $$f(x) = f(i-1, j )$$
  • 其他行和其他列,即i>0,j> 0,只能当前状态来自后一行和后列的状态的和
    $$f(x) = f(i-1, j ) +f(i, j-1 ) $$
  • 一旦遇到阻碍,即u(i,j) =1
    $$f(x) = 0$$

状态转移方程为以下

0.png

3 Python实现

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        # 初始化边界,第一行和第一列
        f = [[1]*n ]+ [[1]*n +[0]*(n-1) for _ in range(m-1)]

        for i in range(0,m):
            for j in range(0,n):
                if obstacleGrid[i][j] ==0:
                    if i >0 and j>0:
                        f[i][j] = f[i-1][j]+f[i][j-1]
                    elif i>0 and j==0:
                        f[i][j] = f[i-1][j]
                    elif i==0 and j>0:
                        f[i][j] = f[i][j-1]
                else:
                    f[i][j] = 0                 
        return f[m-1][n-1]
目录
相关文章
|
12天前
【LeetCode 35】112.路径总和
【LeetCode 35】112.路径总和
19 0
|
28天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
10天前
|
数据采集 Python
Python实用记录(七):通过retinaface对CASIA-WebFace人脸数据集进行清洗,并把错误图路径放入txt文档
使用RetinaFace模型对CASIA-WebFace人脸数据集进行清洗,并将无法检测到人脸的图片路径记录到txt文档中。
26 1
|
12天前
【LeetCode 36】113.路径总和II
【LeetCode 36】113.路径总和II
25 0
|
28天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
9天前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
15 3
|
18天前
|
IDE 开发工具 iOS开发
Python编程案例:查找指定文件大小的文件并输出路径
Python编程案例:查找指定文件大小的文件并输出路径
17 3
|
1月前
|
Python
python之路径 | 11
python之路径 | 11
|
9天前
|
Python
Python实用记录(十二):文件夹下所有文件重命名以及根据图片路径保存到新路径下保存
这篇文章介绍了如何使用Python脚本对TTK100_VOC数据集中的JPEGImages文件夹下的图片文件进行批量重命名,并将它们保存到指定的新路径。
24 0
|
9天前
|
算法 C++ Python
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
12 0