zoukankan      html  css  js  c++  java
  • 63不同路径II

    题目: 一个机器人位于一个 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]])
    View Code

    法二: 官方解法

    思路: 直接在原数据上修改,节省了空间,要学会里面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)
    View Code

    sd

  • 相关阅读:
    [Dynamic Language] Python Django: 模板引擎(3)模板标签和过滤器
    [Linux] Ubuntu: 登陆界面无法输入密码
    [Dynamic Language] Python Exec & Compile
    [Dynamic Language] Python: 类基本结构和继承
    [Linux] VIM 代码折叠
    [Database] MongoDB (2) 高级查询条件操作符
    [Dynamic Language] Python: unindent does not match any outer indentation level
    [Linux] VMware 配置linux后出现提示:Failed to initialize remote display subsystem
    [Database] Redis (2) redispy API Reference
    [Database] MongoDB (1) 基本连接、操作、查询
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12093477.html
Copyright © 2011-2022 走看看