Leetcode:62. 不同路径、63. 不同路径 II(C++)

news2025/1/1 21:43:27

目录

62. 不同路径

问题描述:

实现代码与解析:

深度优先(超时):

原理思路:

动态规划:

原理思路:

数学方法:

原理思路:

63. 不同路径 II

问题描述:

实现代码与解析:

动态规划:

原理思路:


62. 不同路径

问题描述:

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

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

        问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

实现代码与解析:

深度优先(超时):

class Solution {
public:
    int dfs(int i, int j, int m, int n) 
    {
        if (i > m || j > n) return 0; // 越界
        if (i == m && j == n) return 1; // 找到一条路径
        return dfs(i + 1, j, m, n) + dfs(i, j + 1, m, n);
    }
    int uniquePaths(int m, int n) 
    {
        return dfs(1, 1, m, n);
    }
};

原理思路:

        可以看成是二叉树,深度优先遍历,不过这个方法会超时。

动态规划:

class Solution {
public:
    int uniquePaths(int m, int n) 
    {
        vector<vector<int>> dp(m,vector<int>(n));//dp数组,含义:到i,j位置的路径个数
        for(int i=0;i<m;i++) dp[i][0]=1;//第一列初始化
        for(int i=0;i<n;i++) dp[0][i]=1;//第一行初始化
        for(int i=1;i<m;i++)
        {
            for(int j=1;j<n;j++)
            {
                dp[i][j]=dp[i][j-1]+dp[i-1][j];//递推公式
            }
        }
        return dp[m-1][n-1];
    }
};

原理思路:

        动态规划的经典题目,这里题目描述每次只能向下和向右走,dp数组含义是到[i,j]位置可以走的路径条数,理解了这个便很好写出递推的公式了,便是从上位置来的路径和从左位置来的路径之和了,还有dp的初始化,第一列和第一行显然都只有一条路线可以到达,初始化为1。

数学方法:

class Solution {
public:
    int uniquePaths(int m, int n) {
        long long result = 1;
        for (int x = n, y = 1; y < m; ++x, ++y) 
        {
            result = result * x / y;
        }
        return result;
    }
};

原理思路:

        有点概率论那意思,根据题目我们可以判断出要到达终点一共要走 m + n - 2步,其中 m - 1 步是向下走的,所以很容易写出公式:

         注意算的时候,不要把分子分母都算出来再除,很容易超过范围,要一边乘一边除。

63. 不同路径 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

实现代码与解析:

动态规划:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) 
    {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 0));//dp数组
        //dp初始化,第一行
        for(int i = 0; i < n; i++)
        {
            if(obstacleGrid[0][i] == 1)
            {
                break;
            }
            dp[0][i] = 1;
        }
        //dp第一列列初始化
        for(int i = 0; i < m; i++)
        {
            if(obstacleGrid[i][0] == 1)
            {
                break;
            }
            dp[i][0] = 1;
        }
        //开始遍历
        for(int i = 1; i < m; i++)
        {
            for(int j = 1; j < n; j++)
            {
                //注意这里,空位置才求路径,有障碍物不算路径,不然后面的路径推导肯定出现错误
                if(obstacleGrid[i][j] == 0)
                {
                    dp[i][j]=dp[i - 1][j] + dp[i][j - 1];
                }             
            }
        }
        return dp[m - 1][n - 1];
    }
};

原理思路:

        动态规划,此题与上一题的区别就是多了障碍物而已,原理相似,只是需要注意一些区别和细节,比如dp初始化,我们第一行和第一列在没有遇到障碍物时赋值为1,因为一但有障碍物,其后面的格子肯定是过不去的,此题只能向右和下走。还有就是递推公式,我们在空位置才递推,不然在有障碍物的地方也计算路径的话,后面空位置递推出来的路径一定是有错误的。

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

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

相关文章

AcWing蓝桥杯AB组辅导课09、复杂DP

文章目录前言一、复杂DP例题例题1&#xff1a;AcWing 1050. 鸣人的影分身&#xff08;线性dp&#xff09;分析题解&#xff1a;DP例题2&#xff1a;AcWing 1047. 糖果&#xff08;背包问题变形&#xff09;分析题解&#xff1a;DP&#xff08;01背包问题变形&#xff09;例题3&…

静态库与动态库的生成与使用

一、库文件 预编译——>编译——>汇编——>链接&#xff08;使用库&#xff09;——>可执行文件 二、生成库&#xff1a;把大量的已经实现的代码打包起来 生成动态库&#xff1a; 1、将源码遍历汇编生成二进制指令 gcc -fPIC -c child.c -o child.o 2、将所有二进…

即时通讯开发之详解TCP/IP中的UDP 协议

UDP 是传输层协议,和 TCP 协议处于一个分层中,但是与 TCP 协议不同,UDP 协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。UDP 协议头2.1UDP 端口号由于很多软件需要用到 UDP 协议,所以 UDP 协议必须通过某个标志用以区分不同的程序所需要的数据包。端口号的功能…

C 语言零基础入门教程(二十一)

C 头文件 头文件是扩展名为 .h 的文件&#xff0c;包含了 C 函数声明和宏定义&#xff0c;被多个源文件中引用共享。有两种类型的头文件&#xff1a;程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件&#xff0c;需要使用 C 预处理指令 #include 来引用它。前…

Linux | 编辑器gcc/g++的使用【动静态库的认识】

文章目录一、对程序的认知 && 初识gcc1、程序是如何诞生的&#xff1f;2、gcc的初步认识3、如何使用gcc二、gcc逐步分析程序的翻译环境1、预编译【进行宏替换】2、编译【C语言——>汇编语言】3、汇编【汇编语言——>可重定位目标二进制文件】4、链接【生成可执行…

一篇文章学会写SQL

本篇文章主要讲如何写SQL&#xff0c;虽然我在之前有篇文章中写到过数据库的操作和概念&#xff0c;其中有讲到数据库和表的操作语句以及有哪些函数和查询关键字&#xff08;本篇不赘述&#xff09;&#xff0c;但毕竟理解概念和会实践书写是两码事。。 身为一名测试人员&#…

证明:lim (x->0+) x^x=1

原式&#xff1a;lim⁡x→0xx\lim _{x\to 0^{}} {x^{x}}x→0lim​xx 根据公式1:u(x)v(x)eu(x)ln⁡v(x)u(x)^{v(x)}e^{u(x)\ln v(x)}u(x)v(x)eu(x)lnv(x)则原式可以化为lim⁡x→0exln⁡x\lim _{x\to 0^{}} e^{x \ln x}x→0lim​exlnx 接下来利用倒代换进行进一步计算。&#xff…

【USB】USB video class (UVC)相关概念学习

UVC协议 IAD 全称Interface Association Descriptor This is used to describe that two or more interfaces are associated to the same function. An ‘association’ includes two or more interfaces and all of their alternate setting interfaces. IAD用来描述由两个…

一次JVM垃圾收集全过程

目录 JVM堆内存分配 JVM垃圾收集完整过程&#xff08;带图解&#xff09; 在介绍垃圾收集过程之前&#xff0c;有必要先对JVM堆内存做一个回顾&#xff0c;因为讲垃圾收集主要针对的是堆内存。 JVM堆内存分配 在JDK1.8之前&#xff0c;JVM堆内存主要分为新生代、老年代和永…

Kafka和Flink双剑合璧,Confluent收购Immerok引起业内广泛讨论

2023年开年开源界就出了一个大新闻&#xff0c;1月6日Kafka的商业化公司Confluent创始人宣布签署了收购 Immerok 的最终协议&#xff0c;而Immerok是一家为 Apache Flink 提供完全托管服务的初创公司&#xff0c;其创始团队正是Flink的创始团队。 无论是Kafka还是Flink&#x…

MQ 消息丢失、重复、积压问题,如何解决?

引入 MQ 消息中间件最直接的目的是&#xff1a;做系统解耦合流量控制&#xff0c;追其根源还是为了解决互联网系统的高可用和高性能问题。 系统解耦&#xff1a;用 MQ 消息队列&#xff0c;可以隔离系统上下游环境变化带来的不稳定因素&#xff0c;比如京豆服务的系统需求无论如…

你安全吗?丨生活中常见的黑产行为有哪

作者丨黑蛋电视剧《你安全吗&#xff1f;》我也追完了&#xff0c;到了终结篇。在结尾&#xff0c;网安黑产头子马平川终于因为陷害秦淮攻击虎迫系统被查出来就是虎迫内奸&#xff0c;随后也被一系列证据指出饮料厂等薅羊毛事件背后都有马平川的影子&#xff1a;今天我们就来聊…

python基础学习--数据类型、语句、函数

python的语法比较简单&#xff0c;采用缩进形式&#xff0c;如下&#xff1a; 在这里# print absolute value of an integer: a 100 if a > 0:print(a) else:print(-a)插入代码片以“#”开头的语句是注释。 注意&#xff1a;python是大小写敏感的&#xff0c;如果先写错了…

在线 OJ 项目(二) · 操作数据库 · 设计前后端交互的 API · 实现在线编译运行功能

一、操作数据库前的准备二、封装操作数据库数据的相关操作三、设计前后端交互的 API四、实现在线编译运行功能一、操作数据库前的准备 设计数据库表 我们需要对数据库中存储的题目进行操作. 创建一个 “题目表” oj_table 题目的序号 id. 作为题目表的自增主键。 标题 title.…

Android之常见的使用技巧

文章目录1.全局获取Context的技巧2.使用Intent传递对象Serializable方式Parcelable方式3.定制自己的日志工具4.深色主题5.Java和Kotlin代码之间的转换1.全局获取Context的技巧 在Android中&#xff0c;你会发现有很多地方都需要用到Context&#xff0c;例如&#xff1a;弹出To…

设计模式在项目中的运用

一、如何管理庞大而复杂的项目开发&#xff1f;1、从设计原则和思想的角度来看&#xff0c;如何应对庞大而复杂的项目开发&#xff1f;① 封装与抽象&#xff1a;“一切皆文件”:封装了不同类型设备的访问细节&#xff0c;抽象为统一的文件访问方式&#xff0c;更高层的代码就能…

windows下解决Git报错: LF will be replaced by CRLF the next time Git touches it

问题 在命令行执行git add *的时候&#xff0c;提示Warning&#xff1a; 通常情况下是在 Windows环境中才会遇到。 原因 Uinx/Linux采用换行符LF表示下一行&#xff08;LF&#xff1a;LineFeed&#xff0c;中文意思是换行&#xff09;&#xff0c;即&#xff1a;\n&#xff1…

Visual Transformer开端——ViT及其代码实现

深度学习知识点总结 专栏链接: https://blog.csdn.net/qq_39707285/article/details/124005405 此专栏主要总结深度学习中的知识点&#xff0c;从各大数据集比赛开始&#xff0c;介绍历年冠军算法&#xff1b;同时总结深度学习中重要的知识点&#xff0c;包括损失函数、优化器…

购买和登录Linux云服务器

目录 云服务器的购买 SSH登录云服务器 云服务器的购买 我们以腾讯云为例, 其他的服务器厂商也是类似。 1. 进入腾讯云官方网站&#xff1a;学生云服务器_云校园特惠套餐 - 腾讯云 (tencent.com) 2. 登陆网站(可以使用微信登陆) 3.购买云服务器 购买最低级即可&#xff0c;对于…

36/365 java 类的加载 链接 初始化 ClassLoader

1.类的加载&#xff0c;链接&#xff0c;初始化 注意点&#xff1a; Class对象是在类的加载过程中生成的&#xff08;类的数据&#xff08;static,常量&#xff0c;代码&#xff09;在方法区&#xff0c;Class类对象在堆中&#xff09;&#xff0c;这个Class类对象作为方法区中…