题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ).机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”).现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

来源: https://leetcode-cn.com/problems/unique-paths-ii/

法一: 自己的代码

思路: 如果遇到障碍物,则直接将该位置置0,关键是对障碍物后面位置的处理,由于障碍物置0了,仍然可以直接相加.

# 执行用时 :44 ms, 在所有 python3 提交中击败了98.81% 的用户
# 内存消耗 :12.5 MB, 在所有 python3 提交中击败了99.13%的用户
from typing import List
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m = len(obstacleGrid)
n = len(obstacleGrid[0])
# dp中记录的是到达该位置的路径个数
dp = [[1] * n for i in range(m)]
# 第一行和第一列中障碍物后面的路径个数必定为0,所以先置0
# 将dp第一行的障碍物后面的元素都置0
for p in range(n):
if obstacleGrid[0][p] == 0:
pass
else:
dp[0][p] = 0
while p+1 < n:
p = p + 1
dp[0][p] = 0
break
# 将dp第一列的障碍物后面的元素都置0
for p in range(m):
if obstacleGrid[p][0] == 0:
pass
else:
dp[p][0] = 0
while p+1 < m:
p = p + 1
dp[p][0] = 0
break
# 同62中的方法,如果遇到障碍物了,直接将dp中的相应位置置0
for i in range(1, m):
for j in range(1, n):
if obstacleGrid[i][j] == 0:
dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
else:
dp[i][j] = 0
return dp[-1][-1]
if __name__ == '__main__':
duixiang = Solution()
a = duixiang.uniquePathsWithObstacles(
[[1],[0]])

法二: 官方解法

思路: 直接在原数据上修改,节省了空间,要学会里面obstacleGrid[i][0] = int(obstacleGrid[i][0] == 0 and obstacleGrid[i-1][0] == 1)的这个写法.

class Solution(object):
def uniquePathsWithObstacles(self, obstacleGrid):
m = len(obstacleGrid)
n = len(obstacleGrid[0])
if obstacleGrid[0][0] == 1:
return 0
obstacleGrid[0][0] = 1
# 直接在原来的数据上做修改,节省了空间,前提是要先判断左上角的位置是否为1
for i in range(1,m):
# 这里利用了布尔变量的特性,int(True)为1,int(False)为0.
# 这个写法很巧妙,一旦遇到一个1就将它和它后面所有的数都置0,要学会这个写法
obstacleGrid[i][0] = int(obstacleGrid[i][0] == 0 and obstacleGrid[i-1][0] == 1)
for j in range(1, n):
obstacleGrid[0][j] = int(obstacleGrid[0][j] == 0 and obstacleGrid[0][j-1] == 1)
for i in range(1,m):
for j in range(1,n):
if obstacleGrid[i][j] == 0:
obstacleGrid[i][j] = obstacleGrid[i-1][j] + obstacleGrid[i][j-1]
else:
obstacleGrid[i][j] = 0
return obstacleGrid[m-1][n-1]
if __name__ == '__main__':
duixiang = Solution()
a = duixiang.uniquePathsWithObstacles(
[[0,0,0],[0,1,0],[0,0,0]])
print(a)

sd

63不同路径II的更多相关文章

  1. Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II)

    Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II) 初级题目:Leetcode之动态规划(DP)专题-62. 不同路径(Unique Paths) 一个机 ...

  2. Java实现 LeetCode 63 不同路径 II(二)

    63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...

  3. 刷题-力扣-63. 不同路径 II

    63. 不同路径 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-paths-ii/ 著作权归领扣网络所有.商业转 ...

  4. 63.不同路径II

    目录 63.不同路径Ⅱ 题目 题解 63.不同路径Ⅱ 题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动 ...

  5. [LeetCode] 63. 不同路径 II ☆☆☆(动态规划)

    描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在 ...

  6. 63. 不同路径 II leetcode JAVA

    题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在 ...

  7. 63. 不同路径 II

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在考虑网 ...

  8. LeetCode 63. 不同路径 II(Unique Paths II)

    题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). ...

  9. leetcode 63 不同路径II

    二维数组动态规划,还可以采用一维数组进行动态规划. class Solution { public: int uniquePathsWithObstacles(vector<vector< ...

随机推荐

  1. zabbix 启到不起来:active check configuration update from [127.0.0.1:10051] started to fail (cannot connect to [[127.0.0.1]:10051]: [111] Connection refused)

    cat /var/log/zabbix_agent_log 查看日记出现报错:active check configuration update from [127.0.0.1:10051] star ...

  2. 使用nodejs开发一个markdown文档管理小系统(一)Using Nodejs to quickly develop a markdown management system

    好多年没碰过前端jquery了,用一两天时间重温一下,刚好写个小工具, 不递归取文件夹和文件,只写一层,保持足够简单,验证和参数判断暂不写,毕竟只写了几个小时而已,功能算完备了,添加一个简单的管理员权 ...

  3. 解决找不到roslyn\csc.exe文件问题

    csc.exe代表C# 编译器,所以在需要项目nuget包引用”Microsoft.CodeDom.Providers.DotNetCompilerPlatform“以及”Microsoft.Net. ...

  4. volatile关键字解决线程间内存共享变量同步的问题,让变量可以立即同步。

  5. 基于初始种子自动选取的区域生长(python+opencv)

    算法中,初始种子可自动选择(通过不同的划分可以得到不同的种子,可按照自己需要改进算法),图分别为原图(自己画了两笔为了分割成不同区域).灰度图直方图.初始种子图.区域生长结果图.另外,不管时初始种子选 ...

  6. CAP 与 注册中心

    https://blog.csdn.net/fly910905/article/details/100023415 http://www.ruanyifeng.com/blog/2018/07/cap ...

  7. hive的外部表

    最近买了一本hive看,发现书中有一个错误: 我的验证如下: 1.外部表数据存在自己表所属的目录下 2.还发现了 CTAS 操作不能 建立外部表

  8. 清空DataGridView

    DataTable dt = (DataTable)dgv.DataSource; dt.Rows.Clear(); dgv.DataSource = dt;

  9. Django+BootstrapTable实现表格分页

    models.py: from django.db import models # Create your models here. class Article(models.Model): titl ...

  10. jquery checkbox选择器 语法

    jquery checkbox选择器 语法 作用::checkbox 选择器选取类型为 checkbox 的 <input> 元素.大理石平台价格表 语法:$(":checkbo ...