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

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

目录

62. 不同路径

63. 不同路径 II

62. 不同路径

题目

62. 不同路径 - 力扣(LeetCode)

一个机器人位于一个 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

思路

代码随想录:62.不同路径

视频讲解:LeetCode:62.不同路径

动态规划五部曲:

  1. 确定dp数组以及下标含义:使用二维dp数组保存结果,确定dp[i][j]为到达 (i, j) 有多少条不同的路径
  2. 确定递推公式:dp[i] = dp[i - 1][j] + dp[i][j - 1],因为只能沿两种方向移动
  3. 初始化数组:dp[i][0]=1, dp[0][j]=1,因为从起点到(i, 0)和(0, j)的路径都只有一条
  4. 确定遍历顺序:由递推公式得遍历顺序为从左往右,从上往下
  5. 举例推导:

62.不同路径1

题解

独立题解:

class Solution {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];dp[0][0]=1;for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {if(j!=0)dp[i][j]+=dp[i][j-1];if(i!=0)dp[i][j]+=dp[i-1][j];}}return dp[m-1][n-1];}
}

参考题解:

    public static int uniquePaths(int m, int n) {int[][] dp = new int[m][n];//初始化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-1][j]+dp[i][j-1];}}return dp[m-1][n-1];}

63. 不同路径 II

题目

63. 不同路径 II - 力扣(LeetCode)

给定一个 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:

img

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

提示:

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

思路

代码随想录:不同路径II

视频讲解:LeetCode:63. 不同路径 II

动态规划五部曲:

  1. 确定dp数组以及下标含义:使用二维dp数组保存结果,确定dp[i][j]为到达 (i, j) 有多少条不同的路径
  2. 确定递推公式:dp[i] = dp[i - 1][j] + dp[i][j - 1],因为只能沿两种方向移动,注意判断题目所给数组的(i, j)位置是否有障碍,有障碍则保持为0的初始状态
  3. 初始化数组:dp[i][0]=1, dp[0][j]=1,因为从起点到(i, 0)和(0, j)的路径都只有一条,注意遇到障碍之后直接结束数组的初始化:63.不同路径II
  4. 确定遍历顺序:由递推公式得遍历顺序为从左往右,从上往下
  5. 举例推导:
63.不同路径II1

63.不同路径II2

题解

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {if (obstacleGrid[i][0] == 1)break;dp[i][0] = 1;}for (int j = 0; j < n; j++) {if (obstacleGrid[0][j] == 1)break;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];}
}
http://www.lryc.cn/news/466033.html

相关文章:

  • TrickMo 安卓银行木马新变种利用虚假锁屏窃取密码
  • Java | Leetcode Java题解之第493题翻转对
  • uniapp scroll-view翻转90度后,无法滚动问题,并设置滚动条到最底部(手写横屏样式)
  • 腾讯PAG 动画库Android版本的一个问题与排查记录
  • 计算机的算术运算之浮点数
  • Sqlite3 操作笔记
  • mysqlRouter读写分离
  • 【修订中】ffmpeg 知识点
  • Rust初踩坑
  • element-ui 的el-calendar日历组件样式修改
  • LinuxDebian系统安装nginx
  • Redis 数据类型Streams
  • 基智科技CEO张文战:探索火山引擎数据飞轮模式下的大模型应用新机会
  • 【AUTOSAR标准文档】AotuSar结构横向分层详解(RTE、BSW)
  • 新 Chrome 插件可检测 AI 伪造声音;Canary Speech 推出用于临床对话的语音分析技术丨 RTE 开发者日报
  • 1. 路由定义
  • 我们可以用微服务创建状态机吗?
  • 邦芒贴士:职场新人需远离的7种坏习惯
  • 面向医院的统一支付平台产品经验分享
  • http作业
  • AlDente Pro for Mac电脑 充电限制保护工具 安装教程【简单,轻松上手】
  • C语言数据结构之算法复杂度
  • HDU RSA
  • 数据仓库建设 : 主题域简介
  • 开源表单生成器OpnForm
  • Zookeeper面试整理-Zookeeper的基础概念
  • 验证archive_command配置是否正确
  • 2024.10.19小米笔试题解
  • SQL-SERVER导入excel表格
  • Vue学习笔记(三、v-cloak、v-text、v-html指令)