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

【从零开始的LeetCode-算法】63. 不同路径 II

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

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

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

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

示例 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]01

我的解答:

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int y_end = obstacleGrid.length;
        int x_end = obstacleGrid[0].length;
        // 标记数组,需要比原数组长1,允许走到界外
        int[][] dps = new int[y_end + 1][x_end + 1];
        // 初始化数组元素为-1,标识是否走到过该位置
        for(int y = 0;y <= y_end; y++){
            for(int x = 0;x <= x_end; x++){
                dps[y][x] = -1;
            }
        }
        
        return dpsFun(dps,0,0,obstacleGrid);

    }

    /**
        dps:标识数组
        x:当前位置横坐标
        y:当前位置纵坐标
        obstacleGrid:原数组
     */
    private int dpsFun(int[][] dps,int x,int y,int[][] obstacleGrid){
        // 元素不为-1,说明已经走过了,剪枝
        if(dps[y][x] != -1) return dps[y][x];

        // 如果当前位置为障碍物或界外,返回0并标记此路已走过
        if(y >= obstacleGrid.length || x >= obstacleGrid[0].length || obstacleGrid[y][x] == 1) return dps[y][x] = 0;

        // 如果当前位置为终点,则返回1并标记此路已走过
        if(x == obstacleGrid[0].length - 1 && y == obstacleGrid.length - 1) return dps[y][x] = 1;

        // 当前位置向右或向下走有几种可行方案
        return dps[y][x] = dpsFun(dps,x + 1,y,obstacleGrid) + dpsFun(dps,x,y + 1,obstacleGrid);
    }
}


http://www.kler.cn/a/540160.html

相关文章:

  • 【C语言标准库函数】标准输入输出函数详解[4]:二进制文件读写函数
  • 棱光PDF工具箱:一站式解决你的各种需要
  • 《深度学习》——pytorch框架及项目
  • Maven Profile 配置:支持不同环境的构建
  • 【大数据技术】搭建完全分布式高可用大数据集群(ZooKeeper)
  • 卷积神经网络CNN如何处理语音信号
  • bladeX微服务框架如何修改nacos分组
  • 避开Arrays.asList使用的坑
  • SAP ABAP调用DeepSeek API大模型接口
  • git实现回退
  • 让office集成deepseek,支持office和WPS办公软件!(体验感受)
  • 进阶数据结构——单调栈
  • 【JVM详解三】垃圾回收机制
  • 嵌入式硬件篇---OpenMV的硬件流和软件流
  • 使用Chisel建立端口转发与SOCKS5代理隧道
  • [含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的心血管疾病分析系统
  • 使用OpenGL自己定义一个button,响应鼠标消息:掠过、点击、拖动
  • 深度学习-利用预训练的 ResNet 和 DenseNet 模型进行医学影像诊断
  • HiveQL命令(二)- 数据表操作
  • 自动驾驶数据集三剑客:nuScenes、nuImages 与 nuPlan 的技术矩阵与生态协同
  • [LVGL] 在VC_MFC中移植LVGL
  • linux基础命令1
  • 【紫光同创PG2L100H开发板】盘古676系列,盘古100Pro+开发板,MES2L676-100HP
  • Layui树节点添加level属性
  • 【Linux】31.Linux 多线程(5)
  • Python+Flask搭建属于自己的B站,管理自己电脑里面的视频文件。支持对文件分类、重命名、删除等操作。