当前位置: 首页 > news >正文

Leetcode63:不同路径 II

题目描述:

给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。

网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。

返回机器人能够到达右下角的不同路径数量。

测试用例保证答案小于等于 2*10^9

代码思路:

  1. 边界条件检查
    • 首先检查终点(右下角)和起点(左上角)是否有障碍物。如果起点或终点有障碍物,则无法到达终点,直接返回0。
  2. 初始化变量
    • m = len(obstacleGrid):获取网格的行数。
    • n = len(obstacleGrid[0]):获取网格的列数。
    • dp = [[0] * n for _ in range(m)]:创建一个二维数组dp,用于存储到达每个格子的不同路径数。数组的大小与输入的网格相同。
  3. 填充动态规划数组
    • 使用两个嵌套的for循环遍历网格的每个格子。
    • 对于每个格子(i, j)
      • 如果该格子有障碍物(obstacleGrid[i][j] == 1),则无法到达该格子,设置dp[i][j] = 0
      • 否则,根据格子的位置来更新dp[i][j]的值:
        • 如果格子是起点((i, j) == (0, 0)),则只有一条路径到达该格子(即它自己),设置dp[i][j] = 1
        • 如果格子在第一行(i == 0),则只能从左边的格子到达,因此dp[i][j] = dp[i][j - 1]
        • 如果格子在第一列(j == 0),则只能从上面的格子到达,因此dp[i][j] = dp[i - 1][j]
        • 对于其他格子,可以从上面的格子或左边的格子到达,因此dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  4. 返回结果
    • 最后,dp[-1][-1]存储了从左上角到右下角的不同路径数,返回该值作为结果。

代码实现:

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        #dp[m][n] = dp[m - 1][n] + dp[m][n - 1]
        if obstacleGrid[-1][-1] or obstacleGrid[0][0]:
            return 0


        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        dp = [[0] * n for _ in range(m)]

        for i in range(m):
            for j in range(n):
    
                if obstacleGrid[i][j] == 1: dp[i][j] = 0
                else:
                    if i == j == 0: dp[i][j] = 1
                    elif i == 0: dp[i][j] = dp[i][j - 1]
                    elif j == 0: dp[i][j] = dp[i - 1][j] 
                    else: dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

        return dp[-1][-1]

 

http://www.dtcms.com/a/27795.html

相关文章:

  • Oracle EBS 12.1和APEX 集成时 Apache的配置代理
  • OpenAI ChatGPT在心理治疗领域展现超凡同理心,通过图灵测试挑战人类专家
  • win 应用程序无法正常启动(0xc0000142)。请单击确定关闭应用程序
  • 使用Flink Operator部署Flink on k8s方案
  • QT多线程编程基础
  • Nginx(详解以及如何使用)
  • Transformer Decoder 详解
  • 计算机之从入门到精通(From Beginner to Proficient in Computer Science)
  • Qt/C++面试【速通笔记一】
  • 一只企鹅如何改变世界
  • 【Linux C/C++开发】Linux系统轻量级的队列缓存mqueue
  • PassGPT:基于大型语言模型的密码建模和(引导式)生成
  • 【Linux】【网络】不同子网下的客户端和服务器通信
  • PHP+Apache+MySQL安装(Windows)
  • JUC并发—8.并发安全集合一
  • C语言复杂度分析
  • 用HTML5+CSS+JavaScript实现新奇挂钟动画
  • npm安装cnpm,解决node12\14安装cnpm失败问题
  • 在虚拟环境下安装GPU的torch
  • Stack和Queue—模拟实现,实战应用全解析!
  • DeepSeek R1 引发的思考:机器学习时代的人类与 AI 协作
  • 洛谷 P10726 [GESP202406 八级] 空间跳跃 C++ 完整题解
  • MySQL数据库(6)—— 表的增删查改
  • PHP会务会议系统小程序源码
  • 【Leetcode】二叉树的最大深度
  • 什么是bundle?什么是chunk?什么是module?
  • PDF文档管理系统V2.0
  • 《被讨厌的勇气》(七)
  • TensorFlow 2 来训练一个线性回归模型
  • 搜索引擎友好:设计快速收录的网站架构