题目: 一个机器人位于一个 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. VSCode配合chrome浏览器调试cocos2d js项目

    1.准备阶段 具备调试功能的VSCode(我的是在win10上,版本是1.17.1) 在VSCode里下载安装Debugger for Chrome扩展插件. 2.具体操作 创建一个cocosjs工程 ...

  2. 屏蔽iOS升级方法

    1.iPhone或者iPad使用safari浏览器打开http://d.updater.i4.cn/i4tools7/temp/tvos.mobileconfig 2.点击[允许] 3.进入[通用]- ...

  3. windows开启ftp服务

    1.启动或关闭windows-->internet information services-->ftp服务器   选中 2.此电脑右键-->管理-->服务和应用程序--> ...

  4. JS 转化为String的三种方法

    // 1. toString() var num = 8; var numString = num.toString(); console.log(numString); var result = t ...

  5. hiho #1062 : 最近公共祖先·一(树,最近祖先)

    #1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在 ...

  6. C# JSON的序列化与反序列化

    需要添加引用:System.ServiceModel.Web 和 System.Runtime.Serialization,然后使用Using: using System.Runtime.Serial ...

  7. windows和linux开机自启动设置

    Windows 1,启动快捷方式   开始>程序>启动 文件夹中拷贝进去需要开机启动的程序快捷方法,此方法需要相应用户登录系统2,注册为服务,设置启动方式为自动   a,    sc命令  ...

  8. JavaScript 正则表达式——对象,修饰符,元字符,字符类,范围类

    ㈠RegExp 对象 ⑴JavaScript通过内置对象RegExp支持正则表达式   ⑵有两种方法实例化RegExp对象   ①字面量        ②构造函数   ⑶字面量示例 示例1:  你会发 ...

  9. Python Internet 模块

    Python Internet 模块 以下列出了 Python 网络编程的一些重要模块: 协议 功能用处 端口号 Python 模块 HTTP 网页访问 80 httplib, urllib, xml ...

  10. UVA 11181 Possibility Given

    #include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<cmath> ...