算法-DFS+记忆化/动态规划-不同路径 II

news2024/11/15 5:26:38

算法-DFS+记忆化/动态规划-不同路径 II

1 题目概述

1.1 题目出处

https://leetcode.cn/problems/unique-paths-ii

1.2 题目描述

在这里插入图片描述
在这里插入图片描述

2 DFS+记忆化

2.1 思路

注意题意,每次要么往右,要么往下走,也就是说不能走回头路。但是仍有可能走到之前已经访问过的节点。题意是要求走到终点的路径数,假设往右可以走通,往下也可以走通,那么当前格子的走通方法数 = 往右走通方法数 + 往下走通方法数。

2.2 代码

class Solution {
    int m = 0;
    int n = 0;
    int[][] paths = null;
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        m = obstacleGrid.length;
        n = obstacleGrid[0].length;
        paths = new int[m][n];
        return dfs(obstacleGrid, 0, 0);
    }   

    private int dfs(int[][] obstacleGrid, int i, int j) {
        if (paths[i][j] > 0) {
            return paths[i][j];
        }
        if (obstacleGrid[i][j] == 1) {
            return 0;
        }
        if (i == m - 1 && j == n - 1) {
            paths[i][j] = 1;
            return 1;
        }
        int result = 0;
        if (i < m - 1) {
            result += dfs(obstacleGrid, i + 1, j);
        }
        if (j < n - 1) {
            result += dfs(obstacleGrid, i, j + 1);
        }
        paths[i][j] = result;
        return result;
    }
}

2.3 时间复杂度

O(m*n)
在这里插入图片描述

2.4 空间复杂度

O(m*n)

3 二维动态规划

3.1 思路

从上述DFS中思考,可以推出动态规划表达式:dp[i][j] = dp[i+1][j] + dp[i][j+1]。

这里注意两点:

  • dp[m-1][n-1] 的值,需要看obstacleGrid[m-1][n-1]是否为1,如果为1代表是障碍,则直接就返回0了。否则就填为1.
  • 从动态规划表达式可知,需要i和j都从大到小遍历才可计算。

3.2 代码

class Solution {
    
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        if (n == 0) {
            return 1;
        }
        if (obstacleGrid[m - 1][n - 1] == 1) {
            return 0;
        }
        
        // dp[i][j] = dp[i+1][j] + dp[i][j+1]
        int[][] dp = new int[m][n];
        dp[m-1][n-1] = 1;

        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                if (obstacleGrid[i][j] == 1) {
                    dp[i][j] = 0;
                    continue;
                }
                if (i < m - 1) {
                    dp[i][j] = dp[i+1][j];
                }
                if (j < n - 1) {
                    dp[i][j] += dp[i][j+1];
                }
            }
        }
        
        return dp[0][0];
    }
}

3.3 时间复杂度

在这里插入图片描述

O(M*N)

3.4 空间复杂度

O(M*N)

4 一维动态规划

4.1 思路

尝试压缩为一维动态规划。

  1. 考虑dp[i][j] = dp[i+1][j] + dp[i][j+1],那么如果我们每次固定i值,从最后一行的j从大到小递减计算,就能计算出最后一行的各个dp[j]值。
  2. 然后i-1到上一行,此时,dp[j]依然表示此行每个位置的通终点方法数,相当于是已经从当前位置累加了往下走的路线的方法数,即dp[i][j] = dp[i+1][j] + dp[i][j+1]中的 dp[i+1][j],那么我们只需要再计算本行的dp[i][j+1]即可。
  3. 综上所述,我们可以压缩二维动态规划为一维动态规划:dp[j] += dp[j+1]

4.2 代码

class Solution {
    
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        if (n == 0) {
            return 1;
        }
        if (obstacleGrid[m - 1][n - 1] == 1) {
            return 0;
        }
        
        int[] dp = new int[n];
        dp[n-1] = 1;

        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                if (obstacleGrid[i][j] == 1) {
                    dp[j] = 0;
                    continue;
                }
                if (j < n - 1) {
                    dp[j] += dp[j+1];
                }
            }
        }
        
        return dp[0];
    }
}

4.3 时间复杂度

在这里插入图片描述

3.4 空间复杂度

O(N)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态壁纸软件iWall mac中文特色

iWall for mac是一款动态壁纸软件&#xff0c;它可以使用任何格式的漂亮视频(无须转换)&#xff0c;音频(可视化功能)&#xff0c;图片&#xff0c;动画&#xff0c;Flash&#xff0c;gif&#xff0c;swf&#xff0c;程序&#xff0c;网页&#xff0c;网站做为您的动态壁纸&…

gazebo joint 中的type fixed 和continuous的区别

在 Gazebo 中&#xff0c;机器人描述中的元素type属性<joint>指定连接两个链接的关节类型。接头有多种类型&#xff0c;包括fixed和continuous。这是它们之间的区别&#xff1a; 固定关节 ( type“fixed”): 固定关节代表两个链接之间的刚性连接。它不允许连接的链接之…

初识Linux(入门篇)

文章目录 初识 Linux1、Linux 背景1.1、Linux 历史1.2、Linux 官网1.2、Linux 发行版本 2、使用 XShell 远程登录 Linux2.1、下载安装 XShell2.2、查看 Linux 主机 ip2.3、使用 XShell 登陆主机2.4、XShell下的复制粘贴 3、Linux 基本指令3.1、ls 指令3.2、pwd 指令3.3、cd 指令…

iOS 获取模拟器沙盒路径

xcrun simctl get_app_container booted Bundle Identifier data

设计模式01———简单工厂模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 任务&#xff1a;使用【简单工厂模式】生成四种不同怪物 【按不同路径移动】 首先资源商店下载四个怪物模型 接下来我们选取四个怪物作为预制体并分别起名…

华为OD机考B卷 | 100分】阿里巴巴找黄金宝箱(JAVA题解——也许是全网最详)

前言 本人是算法小白&#xff0c;甚至也没有做过Leetcode。所以&#xff0c;我相信【同为菜鸡的我更能理解作为菜鸡的你们的痛点】。 题干 1. 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0~N的箱子&…

Java常量与变量

Java常量与变量 在程序执行过程中&#xff0c;其值不能被改变的量称为常量&#xff0c;其值能被改变的量称为变量。 Java关键字 Java关键字 int public (公有的,可跨包) new finally throw (抛出一个异常对象) continuefloatlongshort extends (继承,用于类继承类) returnbrea…

ThinPlateSpline(TPS)理论和代码

ThinPlateSpline理论和代码 TPS被广泛的应用于各类的任务中, 尤其是生物形态中应用的更多: 人脸, 动物脸等等, TPS是cubic spline的2D泛化形态. 值得注意的是, 图像处理中常用的仿射变换(Affine Transformation), 可以理解成TPS的一个特殊的变种. 暂时先整理相关资源,后面详细…

C++:关于模拟实现vector和list中迭代器模块的理解

文章目录 list和vector的迭代器对比list的实现过程完整代码 本篇是关于vector和list的模拟实现中&#xff0c;关于迭代器模块的更进一步理解&#xff0c;以及在前文的基础上增加对于反向迭代器的实现和库函数的对比等 本篇是写于前面模拟实现的一段时间后&#xff0c;重新回头…

逍遥魔兽:如何在服务器上挂机器人?

逍遥魔兽是一款备受欢迎的魔兽世界经典版本&#xff0c;对于许多玩家来说&#xff0c;为了提升游戏体验和效率&#xff0c;他们希望能够在服务器上挂机器人。本文将为您详细讲解如何实现在逍遥魔兽服务器上挂机器人&#xff0c;以提高游戏进程的自动化效率。 第一部分&#x…

正则表达式(Regular Expression)学习网址分享

正则表达式&#xff08;Regular expressions&#xff0c;也叫REs、 regexs 或regex patterns&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到z 之间的字母&#xff09;和特殊字符&#xff08;称为"元字符"&#xf…

数据库系统工程师------流水线

流水线 流水线周期&#xff1a;工序中最长的那段执行时间。 流水线计算公式&#xff1a;第一条指令计算时间 &#xff08;指令条数 - 1&#xff09;*流水线周期。 流水线吞吐率&#xff1a;指单位时间内流水线完成的任务数量或输出的结果数量。 流水线的加速比&#xff1a;完…

CentOS 编译安装Redis

一、编译配置hiredis.h C来操作redis数据库。通过hiredis接口来实现&#xff0c;目前只能在Linux环境使用。 下载hiredis.h hiredis的下载地址为&#xff1a;https://github.com/redis/hiredis 解压并编译hiredis [rootlocalhost source_code]# pwd /usr/local/source_…

Django实战项目-学习任务系统-用户注册

接着上期代码框架&#xff0c;开发第2个功能&#xff0c;用户注册&#xff0c;在原有用户模型基础上&#xff0c;增加一个学生用户属性表&#xff0c;用来关联学生用户的各种属性值&#xff0c;这个属性表是参考网络小说里系统属性值设计的&#xff0c;方便直观了解用户的能力高…

华为OD机试 - 组成最大数(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

香港专用服务器拥有良好的国际网络连接

香港服务器在多个领域有着广泛的应用。无论是电子商务、金融交易、游戏娱乐还是社交媒体等&#xff0c;香港服务器都能够提供高效稳定的服务。对于跨境电商来说&#xff0c;搭建香港服务器可以更好地满足亚洲用户的购物需求&#xff1b;对于金融机构来说&#xff0c;香港服务器…

安科瑞ARB5系列弧光保护装置,智能电弧光保护,保障用电安全

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 什么是弧光 电弧是放电过程中发生的一种现象&#xff0c;当两点之间的电压超过其工频绝缘强度极限时就会发生。当适当的条件出现时&#xff0c;一个携带着电流的等离子产生&#xff0c;直到电源侧的保护设备断开才会消失。空气在通常条件…

31 数据分析(中)numpy介绍

文章目录 工具excelTableauPower Queryjupytermatplotlibnumpy安装导入包快速掌握&#xff08;bushi&#xff09;array和list的相互转化 np的range多维数组的属性array的改变形状array升降维度array内元素的类型数和array的运算array之间的加减法认识轴切片条件与逻辑修改值app…

大规模语言模型高效调参--混合高效微调系列(MAM Adapter,UniPELT)

近年来提出了多种参数高效的迁移学习方法&#xff0c; 这些方法仅微调少量(额外) 参数即可获得强大的性能。虽 然有效&#xff0c; 但人们对为什么有效的关键要素以及各种高效微调方法之间的联系知之甚少。 Adapter 、Prefix Tuning、 LoRA (在结构上和公式上)看起来都不太一样…

SpringCloud小项目——订单积分商城 使用Nacos、Open Feign、Gateway、Sentinel技术栈

目录 引出小项目要求创建极简数据库表订单表&#xff0c;订单明细表商品表积分表 相关微服务积分微服务产品微服务订单微服务调用积分和订单微服务 网关微服务登陆认证通过网关实现对外提供接口API走网关功能 sentinel相关使用Sentinel限流&#xff0c;流量整形Sentinel降级服务…