首页 > 其他分享 >【代码随想录】刷题记录(102)-不同路径 II

【代码随想录】刷题记录(102)-不同路径 II

时间:2025-01-14 16:31:43浏览次数:3  
标签:障碍物 obstacleGrid 随想录 II range 102 col dp row

题目描述:

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

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

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

测试用例保证答案小于等于 2 * 109

 

示例 1:

 

930934dec138719c2feb94ecc73452b6.jpeg

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

示例 2:

 

db4f368c2517d0e755e816585a94eafa.jpeg

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

 

提示:

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

 

我的作答:

讨厌加障碍物???和上题的不同在于:(1)障碍物在边界上:初始化边界,一旦碰到障碍物,则障碍物格子和这条边后面的格子都为0了(因为没法往其他方向走,不能绕过去);(2)障碍物不在边界上:只要碰到障碍物这个格子就是0。(我在这里一开始还添加了判断条件前一步行和列至少要有一个格子不为0,但其实没必要,因为如果都为0,和也是0,不影响)

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        row = len(obstacleGrid)
        col = len(obstacleGrid[0])
        if obstacleGrid[0][0]==1: return 0
        dp = [[0 for _ in range(col)] for _ in range(row)] #初始化!!
        dp[0][0] = 1
        if col>1:
            for j in range(1, col):
                if obstacleGrid[0][j]==0 and dp[0][j-1]!=0:
                   dp[0][j] = 1 
        if row>1:
            for i in range(1, row):
                if obstacleGrid[i][0]==0 and dp[i-1][0]!=0:
                    dp[i][0] = 1
        for i in range(1, row):
            for j in range(1, col):
                if obstacleGrid[i][j]==0:
                    dp[i][j] = dp[i-1][j]+dp[i][j-1]
                else:
                    dp[i][j] = 0
        return dp[row-1][col-1] 

错误总结:(1)我一开始写的是dp=[[0]*col]*row,但是这样测试不过,查资料显示是这一行创建了一个row行的列表,其中每一行都是对同一个[0]*col表的引用。因此,当dp[0][0]=1时,实际上修改了所有行的第一个元素,使得dp变成了[[1,0,0...],[1,0,0...]]

(2)把边界障碍物后面的格子都变为0,我的想法是利用前一个格子判断:因为一旦碰到障碍物dp[i][0]或者dp[0][j]就会保持初始值0,这样在判断的时候下一个边界格子也会继续0。。

0377834ce6dc4b4aac0cda89522ee074.png

无语了家人们,感觉受到了打击

 

参考:

太强了,太巧妙了:先判断起点and终点是否有障碍物;这个填充边界的方法太棒了吧

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        m = len(obstacleGrid)  # 网格的行数
        n = len(obstacleGrid[0])  # 网格的列数
        
        if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1:
            # 如果起点或终点有障碍物,直接返回0
            return 0
        
        dp = [[0] * n for _ in range(m)]  # 创建一个二维列表用于存储路径数
        
        # 设置起点的路径数为1
        dp[0][0] = 1 if obstacleGrid[0][0] == 0 else 0
        
        # 计算第一列的路径数
        for i in range(1, m):
            if obstacleGrid[i][0] == 0:
                dp[i][0] = dp[i - 1][0]
        
        # 计算第一行的路径数
        for j in range(1, n):
            if obstacleGrid[0][j] == 0:
                dp[0][j] = dp[0][j - 1]
        
        # 计算其他位置的路径数
        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 1:
                    continue
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        
        return dp[m - 1][n - 1]  # 返回终点的路径数

7a893885b9824cf0bc18e214249fdc33.png

 

标签:障碍物,obstacleGrid,随想录,II,range,102,col,dp,row
From: https://blog.csdn.net/Aerochacha/article/details/145141918

相关文章

  • 代码随想录Day35 | 01背包问题 二维,01背包问题 一维,416.分割等和子集
    代码随想录Day35|01背包问题二维,01背包问题一维,416.分割等和子集01背包问题二维动态规划经典问题dp定义:dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少状态转移方程:dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+va......
  • 如何在虚拟主机或IIS中增加JSON扩展名的MIME类型?
    在虚拟主机或IIS中增加JSON扩展名的MIME类型是确保服务器正确处理JSON文件的关键步骤。以下是针对IIS7及以上版本的具体操作方法和注意事项,帮助您顺利完成设置。操作步骤打开IIS管理器在服务器上启动IIS管理器,连接到目标站点。选择站点在左侧树形结构中,展开服务器节点......
  • 如何在虚拟主机或 IIS 中增加 JSON 扩展名的 MIME 类型?
    在虚拟主机或IIS中增加JSON扩展名的MIME类型,可以按照以下步骤进行:IIS7.0及以上版本打开IIS管理器:在服务器上打开IIS管理器。选择站点:在左侧树状结构中选择要配置的站点。进入MIME类型设置:在右侧操作面板中找到“MIME类型”并点击进入。添加......
  • 代码随想录算法训练营总结
            为期2个月的训练营时间,总算是一步一步的顺利结束了,撒花撒花!!!    这个训练营算是我第一次比较系统的进行学习数据结构和算法以及刷力扣,以前总是刷到一半就半途而费了,这次总算是坚持着跟着群里的打卡节奏一步一步的完结了。    对于内容来说,内......
  • 代码随想录算法训练营第五十九天|KM47.参加科学大会|KM94.城市间货物运输Ⅰ
    47.参加科学大会(第六期模拟笔试)2、堆优化版(该方法没看懂)邻接矩阵的优点:表达方式简单,易于理解检查任意两个顶点间是否存在边的操作非常快适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。缺点:遇到稀疏图,会导致申请过大的二维数组造成空间浪费......
  • 代码随想录:最大二叉树
    白送/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr),right(nullptr){}......
  • 代码随想录:从中序与后序遍历序列构造二叉树
    /**Definitionforabinarytreenode.structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(intx):val(x),left(nullptr),right(nullptr){}TreeNode(intx,TreeNo......
  • leetcode刷题记录(java)——参考代码随想录:数组 链表 哈希表
    四、题目之:代码随想录https://programmercarl.com/(1)代码随想录:数组704.二分查找classSolution{publicintsearch(int[]nums,inttarget){if(target<nums[0]||target>nums[nums.length-1]){return-1;}intleft=0......
  • 《Java核心技术II》网络使用telnet
    使用telnettelnet是一种用于网络编程的非常强大的调试工具,可以在命令shell中输入telnet来启动它。注释:在Windows中需要激活它,控制面板->程序->打开/关闭Windows特性->Telnet客户端。连接当日时间服务连接到当日时间服务,由美国国家标准与技术研究所运维,提......
  • 代码随想录刷题第五天
    今日任务  242.有效的字母异位词  349. 两个数组的交集  202. 快乐数 1. 两数之和 242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。示例 1:输入:s="anagram",t="nagaram"输出:true示例......