代码随想录算法训练营第39天| Leetcode 62.不同路径、Leetcode 63. 不同路径 II

文章目录

    • Leetcode 62.不同路径
    • Leetcode 63. 不同路径 II

Leetcode 62.不同路径

题目链接:Leetcode 62.不同路径
题目描述: 一个机器人位于一个 m x n 网格的左上角 ,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径?
思路: 本题算是属于高中数学排列组合的基本问题,如果想从左上角移动到右下角,无论如何移动,整体上一定是向下移动m-1次,向右移动n-1次,一共移动m+n-2,因此用数学表达式描述就是:

图片来源于Leetcode题解区
注:上述图片来源于Leetcode题解区
想了解更多排列组合的基础知识可以自行搜索,在这里不再赘述。

代码如下:(数学方法)

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;}
};
  • 时间复杂度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))
  • 空间复杂度: O ( 1 ) O(1) O(1)

当然本题还可以利用动态规划来解决:

  • 定义dp[i][j] :表示从(0 ,0)出发,到(i ,j)dp[i][j]条不同的路径。
  • 求解dp[i][j]dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  • 初始化:dp[i][0]dp[0][i]都可以从起点移动一次到达,因此初始化为1
  • 结果:dp[m-1][n-1]

代码如下:(动态规划)

class Solution {
public:int uniquePaths(int m, int n) {int dp[m + 5][n + 5]; //防止数组越界for (int i = 0; i < n; i++)dp[0][i] = 1;for (int i = 0; i < m; i++)dp[i][0] = 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) O(m×n)
  • 空间复杂度: O ( m × n ) O(m × n) O(m×n)

(动态规划+滚动数组优化)

class Solution {
public:int uniquePaths(int m, int n) {int dp[n + 5]; //防止数组越界for (int i = 0; i < n; i++)dp[i] = 1;for (int i = 1; i < m; i++)for (int j = 1; j < n; j++) {dp[j] += dp[j - 1];}return dp[n - 1];}
};
  • 时间复杂度: O ( m × n ) O(m × n) O(m×n)
  • 空间复杂度: O ( n ) O(n) O(n)

Leetcode 63. 不同路径 II

题目链接:Leetcode 63. 不同路径 II
题目描述: 一个机器人位于一个 m x n 网格的左上角 ,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 10来表示。
思路: 这道题就用不了数学方法了,因为不能确定障碍物挡住了多少路线,所以使用动态规划。

  • 定义dp[i][j] :表示从(0 ,0)出发,到(i ,j)dp[i][j]条不同的路径。
  • 求解dp[i][j]dp[i][j] = dp[i - 1][j] + dp[i][j - 1],如果dp[i][j]为障碍物,则跳过本次循环
  • 初始化:dp[i][0]dp[0][i]都可以从起点移动一次到达,未被障碍物挡住的元素初始化为1
  • 结果:dp[m-1][n-1]

代码如下:

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();if (obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1)return 0; //起点和终点有障碍物则无路径vector<vector<int>> dp(m, vector<int>(n, 0));//初始化for (int i = 0; i < n && obstacleGrid[0][i] == 0; i++)dp[0][i] = 1;for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++)dp[i][0] = 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 ( m × n ) O(m × n) O(m×n)
  • 空间复杂度: O ( m × n ) O(m × n) O(m×n)

总结: 这两道题还是比较简单的,递推公式很好想到。

最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!

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

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

相关文章

数通HCIE学员心得:跨界、转行,我在誉天开启人生新篇章

大家好&#xff0c;我是来自誉天的田同学。 我和誉天的故事开始于22年的8月份。毕业之后&#xff0c;由于对自身专业的不喜欢&#xff0c;我对未来感到非常迷茫。也就是这个时候&#xff0c;我接触到了誉天&#xff0c;开启了我的人生新篇章。 一开始我就想着要转行&#xff…

Project_Euler-14 题解

Project_Euler-14 题解 题目 思路 从暴力枚举出发&#xff0c;枚举100万以内的所有数字&#xff0c;对于每一个数&#xff0c;维护一个长度&#xff0c;每根据公式执行一次运算就加一。 最后取最大值。 暴力枚举代码 #include <stdio.h> #include <stdlib.h> #…

大数据 - Spark系列《十一》- Spark累加器详解

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《…

大型语言模型的语义搜索(一):关键词搜索

关键词搜索(Keyword Search)是文本搜索种一种常用的技术&#xff0c;很多知名的应用app比如Spotify、YouTube 或 Google map等都会使用关键词搜索的算法来实现用户的搜索任务&#xff0c;关键词搜索是构建搜索系统最常用的方法&#xff0c;最常用的搜索算法是Okapi BM25&#x…

【文件搜索项目】使用jdbc操作SQLite

一. 插入&#xff08;采用变量的方式插入&#xff09; 1.创建数据源.DateSource 2.建立连接 3.构造SQL语句 4.执行SQL语句 5.释放资源 public class TestSQLite {public static void main(String[] args) throws SQLException {textInsert();}public static void textInsert(…

超级抽象的前端2

vue3的调用方法失败的原因 function validateConfirm(rule, value, callback) {if (value ! form.password) {callback(new Error(两次输入的密码不一致))} else {callback()}function showAgreement() {dialogVisible.value true}function submitForm() {// 这里是提交表单的…

【RT-Thread基础教程】线程优先级、Tick与线程状态

文章目录 前言一、线程优先级1.1 线程优先级是什么1.2 设置优先级范围 二、时间片2.1 Tick是什么2.2 时间片是什么2.3 时间片轮转 三、线程状态3.1 线程有哪些状态3.2 完整的状态转换图 总结 前言 在 RT-Thread 操作系统中&#xff0c;线程的优先级、Tick 以及线程状态是非常重…

每日一练 | 华为认证真题练习Day187

1、关于BGP状态机描述错误的 A. IDIE状态下&#xff0c;BGP拒绝任何进入的连接请求&#xff0c;是BGP初始状态 B. ACTIVE状态下&#xff0c;BGP将尝试进行TCP连接的建立&#xff0c;是BGP的中间状态 C. ESTABLISHED状态下&#xff0c;BGP对等体间可以交换UPDATE报文&#xf…

算法--动态规划(背包问题)

这里写目录标题 总览dp问题的优化01背包问题概述算法思想算法思想中的注意点例题代码等效为一维数组 完全背包问题概述算法思想例题代码等效为二维数组等效为一维数组 多重背包问题概述算法思想例题代码优化&#xff08;采用二进制的方式&#xff09;基本思想时间复杂度例题代码…

开发Chrome插件,background.js中log打印未出现在控制台

不同于内容脚本&#xff08;通常命名content.js&#xff09;&#xff0c;在后台脚本&#xff08;通常命名background.js或service-worker.js&#xff09;中console.log并不会在控制台中直接显示。 要查看后台脚本上下文的正确控制台&#xff0c;执行如下步骤&#xff1a; 访问…

2024年2月17日~2月23日周报

文章目录 一、前言二、DDNet架构学习2.1 数据预处理2.2 网络模型构建 三、基于深度学习地震数据去噪处理3.1 深度学习在地震数据去噪中的研究方向3.2 深度学习地震数据去噪流程3.2.1 数据集准备3.2.2 模型构建3.2.3 训练网络 3.3 基于DnCNN的地震数据去噪实验 四、小结4.1 存在…

前端项目打包体积分析与优化

一、安装依赖分析工具 npm install webpack-bundle-analyz 二、修改webpack.config.js文件 1、导入上面下载的包 2、在plugins里创建实例 三、启动打包命令 npm run build 会弹出如下界面&#xff1a; 四、优化 1、通过CDN导入react-dom文件 修改webpack.config.js文件里…

【前端素材】推荐优质后台管理系统GramOs平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

Linux环境非root用户配置SSH免密登录,并解决登录仍提示输入密码

Linux环境非root用户配置SSH免密登录&#xff0c;并解决登录仍提示输入密码 ssh免密登录的简单理解 以A和B进行举例&#xff1a;A免密登录B &#xff08;即在A服务器输入命令&#xff1a;ssh 非root用户名B的IP地址&#xff09;可以直接免密码直接登录 A生成私钥和公钥&#…

QT基本组件

四、基本组件 Designer 设计师&#xff08;重点&#xff09; Qt包含了一个Designer程序&#xff0c;用于通过可视化界面设计开发界面&#xff0c;保存文件格式为.ui&#xff08;界面文件&#xff09;。界面文件内部使用xml语法的标签式语言。 在Qt Creator中创建文件时&#xf…

​分享87个Html企业模板,总有一款适合您

分享87个Html企业模板&#xff0c;总有一款适合您 87个Html企业模板下载链接&#xff1a;https://pan.baidu.com/s/1iBpfaBRgMJBv4pj07rZhOg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集…

【STM32】Keil RTE使用记录

0 前言 最近因为任务需要&#xff0c;再次开始研究STM32&#xff0c;打算过一遍之前记录的笔记&#xff0c;在创建工程模板时&#xff0c;突然发现一个之前被自己忽略的东西&#xff0c;那就是创建项目时会弹出的Run-Time Environment&#xff0c;抱着好奇的心态去找了一些资料…

Rust: reqwest库示例

一、异步处理单任务 1、cargo.toml [dependencies] tokio { version "1.0.0", features ["full", "tracing"] } tokio-util { version "0.7.0", features ["full"] } tokio-stream { version "0.1" }…

【学习笔记】数据结构与算法03:栈与队列

知识出处&#xff1a;Hello算法&#xff1a;https://www.hello-algo.com/. 文章目录 2.2 栈和队列2.2.1 「栈 stack」2.2.1.1 栈的常用操作2.2.1.2 栈的典型应用 2.2.2「队列 queue」2.2.2.1 队列的常用操作2.2.2.2 队列的典型应用 2.2.3 双向队列 「double-ended queue」2.2.3…

论文阅读——SimpleClick

SimpleClick: Interactive Image Segmentation with Simple Vision Transformers 模型直接在VIT上增加交互是分割 用VIT MAE方法训练的预训练权重 用交互式分割方法微调&#xff0c;微调流程&#xff1a; 1、在当前分割自动模拟点击&#xff0c;没有人为提供的点击 受到RITM启发…