模拟卷Leetcode【普通】063. 不同路径 II

063. 不同路径 II

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

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

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

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

示例 1:

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

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

示例 2:

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j] 为 0 或 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

扫描二维码关注公众号,回复: 13450007 查看本文章

代码:

import time
from typing import List


class Solution:
    def __init__(self):
        """
        ac之后发现思路和很多答案不一样,虽然都是dp的思路。
        我说一下我的想法:

        右下角是重点,在这就两种情况,如果end是障碍return 0,如果不是就1。

        因为只能往下和往右,不能往回走,所以便从end往回遍历:
        - 如果是障碍物,此格路线数量 = 0
        - 如果不是障碍物,路线数量 = 右边一格的路线数量 + 下边一格的路线数量
        - 当然,如果是最下面一行和最右边一列,就不存在下边一格和右边一格,要区分一下

        因为python的机制,一行行分析比较方便,如果是c++或java,从最右一列往左也是可以的,总之要么是“先从下往上再从右往左”,要么是“先从右往左再从下往上”,本质没有区别。
        """
        pass

    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        if obstacleGrid[-1][-1] == 1:return 0
        width = len(obstacleGrid[0])
        height = len(obstacleGrid)
        map = [[0 for _ in range(width)] for _ in range(height)]
        for row_id,row in enumerate(obstacleGrid[::-1]):
            row_id = height-row_id-1
            for col_id,is_stone in enumerate(row[::-1]):
                col_id=width-col_id-1
                if row_id==height-1 and col_id==width-1:
                    map[row_id][col_id] = 1 # 终点为一种情况
                elif is_stone:
                    map[row_id][col_id] = 0 # 如果是障碍则0种情况
                elif row_id<height-1 and col_id<width-1:    # 不靠边 = 下面+右边
                    map[row_id][col_id] = map[row_id + 1][col_id] + map[row_id][col_id + 1]
                elif row_id<height-1:   # 不是最下面一行 (是最右一列)= 下面
                    map[row_id][col_id] = map[row_id + 1][col_id]
                else: # 是最下面一行 = 右边
                    map[row_id][col_id] = map[row_id][col_id + 1]
                # print(f'point:[{row_id}][{col_id}]={is_stone}, map:{map}')
        # print(map)
        return map[0][0]


def test(data_test):
    s = Solution()
    return s.uniquePathsWithObstacles(data_test)


if __name__ == '__main__':
    datas = [
        [[0,0,0],[0,1,0],[0,0,0]],    # 2
        # [[0,0,0],[0,1,0]],
        # [[1,2,3],[4,5,6],[7,8,9]],
        # [[0,0,0],[0,1,0]],
        [[0,1],[0,0]],    # 1
        [[0,0],[0,1]],    # 0
        [[0, 0], [1, 1], [0, 0]],#0
    ]
    for data_test in datas:
        t0 = time.time()
        print('-' * 50)
        print('input:', data_test)
        print('output:', test(data_test))
        print(f'use time:{
      
      time.time() - t0}s')

备注:
GitHub:https://github.com/monijuan/leetcode_python

CSDN汇总:模拟卷Leetcode 题解汇总_卷子的博客-CSDN博客

可以加QQ群交流:1092754609

leetcode_python.utils详见汇总页说明
先刷的题,之后用脚本生成的blog,如果有错请留言,我看到了会修改的!谢谢!

猜你喜欢

转载自blog.csdn.net/qq_34451909/article/details/121562745
今日推荐