算法训练Day39:62.不同路径 63. 不同路径 II 动态规划

news2024/12/27 1:48:13

文章目录

  • 不同路径
    • 题解(动态规划)
    • 数论方法
  • [不同路径 II](https://leetcode.cn/problems/unique-paths-ii/description/)
    • 题解

不同路径

CategoryDifficultyLikesDislikesContestSlugProblemIndexScore
algorithmsMedium (67.70%)17460--0
Tags

Companies

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

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

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

示例 1:

img

输入: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

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109

Discussion | Solution

题解(动态规划)

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n,0));
        for(int i = 0; i < m; ++i) dp[i][0] = 1;
        for(int j = 0; j < n; ++j) dp[0][j] = 1;
        for(int i = 1; i < m; ++i) {
            for(int j = 1; j < n; ++j) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
};
  • 时间复杂度:O(m × n)
  • 空间复杂度:O(m × n)

数论方法

可以转化为,给你m + n - 2个不同的数,随便取m - 1个数,有几种取法。

class Solution {
public:
    int uniquePaths(int m, int n) {
        long long numerator = 1; // 分子
        int denominator = m - 1; // 分母
        int count = m - 1;
        int t = m + n - 2;
        while (count--) {
            numerator *= (t--);
            while (denominator != 0 && numerator % denominator == 0) {
                numerator /= denominator;
                denominator--;
            }
        }
        return numerator;
    }
};
  • 时间复杂度:O(m)
  • 空间复杂度:O(1)

不同路径 II

CategoryDifficultyLikesDislikesContestSlugProblemIndexScore
algorithmsMedium (41.00%)10320--0
Tags

数组 | 动态规划 | 矩阵

Companies

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

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

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 10 来表示。

示例 1:

img

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

示例 2:

img

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

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j]01

Discussion | Solution

题解

// @lc code=start
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
    if(obstacleGrid[m-1][n-1] == 1 || obstacleGrid[0][0] == 1) {
        return 0;
    }
    vector<vector<int>> dp(m,vector<int>(n,0));
    for(int i = 0; i < m &&obstacleGrid[i][0] == 0;++i) dp[i][0] = 1;
    for(int j = 0; j < n &&obstacleGrid[0][j] == 0;++j) dp[0][j] = 1;
    for(int i = 1; i < m; ++i) {
        for(int j = 1;j < n;++j) {
            if(obstacleGrid[i][j] == 1) continue;
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
        }
    }
    return dp[m-1][n-1];
    }
};
  • 时间复杂度:O(n × m),n、m 分别为obstacleGrid 长度和宽度
  • 空间复杂度:O(n × m)

同样我们给出空间优化版本:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        if (obstacleGrid[0][0] == 1)
            return 0;
        vector<int> dp(obstacleGrid[0].size());
        for (int j = 0; j < dp.size(); ++j)
            if (obstacleGrid[0][j] == 1)
                dp[j] = 0;
            else if (j == 0)
                dp[j] = 1;
            else
                dp[j] = dp[j-1];

        for (int i = 1; i < obstacleGrid.size(); ++i)
            for (int j = 0; j < dp.size(); ++j){
                if (obstacleGrid[i][j] == 1)
                    dp[j] = 0;
                else if (j != 0)
                    dp[j] = dp[j] + dp[j-1];
            }
        return dp.back();
    }
};
  • 时间复杂度:O(n × m),n、m 分别为obstacleGrid 长度和宽度
    ][j] == 1)
    dp[j] = 0;
    else if (j != 0)
    dp[j] = dp[j] + dp[j-1];
    }
    return dp.back();
    }
    };

- 时间复杂度:O(n × m),n、m 分别为obstacleGrid 长度和宽度
- 空间复杂度:O(m)

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

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

相关文章

Linux基础—网络设置

Linux基础—网络设置 一、查看网络配置1.查看网络接口信息 ifconfig2.查看主机名称 hostname3.查看路由表条目 route4.查看网络连接情况 netstat5.获取socket统计信息 ss 二、测试网络连接1.测试网络连接 ping2.跟踪数据包 traceroute3.域名解析 nslookup 三、使用网络配置命令…

拷贝构造与深浅拷贝

文章目录 一、拷贝构造函数二、拷贝初始化三、深浅拷贝 一、拷贝构造函数 如果一个构造函数的第一个参数是自身类型的引用&#xff0c;而且任何额外参数都有默认值&#xff0c;则此构造函数是拷贝构造函数。 class person { public: person(); //默认构造函数 pe…

54家备案法人信用评级机构名单

2023年4月20日&#xff0c;中国人民银行官网公示备案法人信用评级机构名单&#xff0c;共有54家机构获得了信用评级备案&#xff0c;并进行如下提示&#xff1a; 1.2019年11月26日&#xff0c;人民银行、发展改革委、财政部、证监会联合发布《信用评级业管理暂行办法》&#xf…

C语言之 顺序表(sequence chart)

线性表 线性表是n个具有相同特性的数据元素的有限序列。 常见的有&#xff1a;顺序表、链表、栈、队列、字符串.... 线性表在逻辑上是线性结构的&#xff0c;即一条连续的直线 但在物理结构上不一定是连续的&#xff0c;其在物理存储时&#xff0c;通常以数组和链式结构的形式…

观察者模式解读

目录 问题引进 天气预报项目需求 天气预报设计方案 1-普通方案 传统方式代码实现 观察者模式原理 观察者模式解决天气预报需求 代码实现 观察者模式的好处 问题引进 天气预报项目需求 1) 气象站可以将每天测量到的温度&#xff0c;湿度&#xff0c;气压等等以公告的形式…

idm下载器是免费的吗?有哪些功能

对于PC用户来说&#xff0c;拥有一款好用和快速的下载工具&#xff0c;对我们来说至关重要&#xff0c;可以极大提高我们的工作效率和PC用户体验。IDM可以实现高速下载&#xff0c;其核心原理就是多线程下载&#xff0c;理论上可以达到带宽的峰值速度&#xff0c;深受用户的喜爱…

Python单向链表操作

目录 一、单向链表 单向链表示例图 二、单向链表的操作 1、判断链表是否为空 2&#xff0c;链表长度 3&#xff0c;遍历整个链表 4&#xff0c;在链表头部添加元素 5、链表尾部添加元素 6&#xff0c;在指定位置插入元素 7&#xff0c;修改指定位置的元素 8&#xff…

可视化Echarts中title、tooltip、legend、grid属性的常用设置

title中常用的设置 配置项--tooltip ​编辑 配置项--legend 配置项--grid title中常用的设置 title 标题组件&#xff0c;包含主标题和副标题。 以下是常用的对标题的设置 title:{//设置图表的标题text:"主标题",link:"baidu.com", //设置标题超链接…

详解C语言string.h中常见的14个库函数(三)

本篇博客继续讲解C语言string.h头文件中的库函数。本篇博客计划讲解3个函数&#xff0c;分别是&#xff1a;strstr, strtok, strerror。其中strstr函数我会用一种最简单的方式模拟实现。 strstr char * strstr ( const char * str1, const char * str2 );strstr可以在str1中查…

用yolov5+playwright过滑动验证码

目录 梳理思路 训练模型 编写代码 总结与提高 源码下载 在上一节&#xff0c;我们通过opencv-pythonplaywright成功过掉了QQ空间的滑动验证码。在本节&#xff0c;我们将使用yolov5playwright来实现相同效果。 注&#xff1a;因为yolov5的配置教程网上已经很多了&#xff…

C++初阶之函数重载

目录 前言 函数重载 1.函数重载的概念 2.C支持函数重载的原理--名字修饰(name Mangling) 前言 今天小编给大家带来的是C中关于函数重载的内容&#xff0c;和C语言不一样&#xff0c;函数重载是C语言特有的&#xff0c;那么该功能实现的底层原理是什么呢&#xff1f;请大家…

Idea配置maven,指定settings.xml文件不生效

一.简介 最近单位要求把项目的仓库配置从阿里云改为nexus私服&#xff0c;配置了一个settings-nexus.xml的配置文件&#xff0c;idea的maven配置指定了该settings-nexus.xml文件&#xff0c;发现走的还是阿里云的&#xff0c;新的settings-nexus.xml竟然不生效&#xff0c;依赖…

分支和循环语句(1)

文章目录 目录1. 什么是语句2. 分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 if书写形式的对比2.1.3 练习 2.2 switch语句2.2.1 在switch语句中的 break2.2.2 default子句2.2.3 练习 3. 循环语句3.1 while循环3.1.1 while语句中的break和continue 附…

记一次fastjson反序列化到内网靶标

声明&#xff1a;文中涉及到的技术和工具&#xff0c;仅供学习使用&#xff0c;禁止从事任何非法活动&#xff0c;如因此造成的直接或间接损失&#xff0c;均由使用者自行承担责任。 点点关注不迷路&#xff0c;每周不定时持续分享各种干货。 众亦信安&#xff0c;中意你啊&a…

多种方法解决This is usually caused by another repository pushing to the same ref的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误4. 解决该错误的其他方法 1. 复现错误 今天使用git status查看文件状态&#xff0c;发现有一个文件未提交&#xff0c;如下代码所示&#xff1a; D:\project\test>git status On branch master Your branch is up to date with …

sftp常用命令介绍

sftp常用命令&#xff1a; 1. sftp 登录sftp服务器 sftp userip ​​​​​​ 如需要看全部命令&#xff1a;则使用help即可 2. pwd和lpwd 、 ls和lls 、cd和lcd 等 sftp登录之后默认操作是远程服务器&#xff0c;当需要操作本地时&#xff0c;就需要在前边加“l”&#…

【wpf踩坑日记】搞错了,眼睛问题(:))

背景 今天遇到一个草鸡奇葩的问题&#xff1a; ComboBox 选择时 没有触发绑定的属性的set。 其实看错了&#xff0c;Mode写出OneWay&#xff0c;应该是TowWay。 不然是会触发set的。兄弟们不用往下看了。。。。。 哎&#xff0c;有的时候就会碰到这种情况&#xff0c;我还…

Ubuntu上跑通PaddleOCR

书接上文。刚才说到我已经在NUC8里灌上了Windows Server 2019。接下来也顺利的启用了Hyper-V角色并装好了一台Ubuntu 22.04 LTS 的虚机。由于自从上回在树莓派上跑通了Paddle-Lite-Demo之后想再研究一下PaddleOCR但进展不顺&#xff0c;因此决定先不折腾了&#xff0c;还是从x6…

python常见问题总结

对于长期深耕在python爬虫的程序员来说&#xff0c;如何快速解决代码中的问题它是作为合格的程序员应该具备的基本素质。下面将我总结整理出有关python的一些常见问题记录下来方便后期查证。 Python python 没有多态&#xff0c;而是鸭子类型 多继承&#xff0c;没有接口&…

【操作系统】CPU 缓存一致性

【操作系统】CPU 缓存一致性、MESI 协议 参考资料&#xff1a; CPU缓存一致性协议(MESI) 【JUC】Java并发机制的底层实现原理 CPU 缓存一致性 文章目录 【操作系统】CPU 缓存一致性、MESI 协议CPU Cache 的数据写入写直达写回 缓存一致性问题总线嗅探MESI 协议总结 CPU Cache …