代码随想录第39天|62.不同路径 63. 不同路径 II

62.不同路径 

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

代码随想录 (programmercarl.com)

动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili

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

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

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

示例 1:

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

示例 2:

  • 输入:m = 2, n = 3
  • 输出:3

解释: 从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

示例 3:

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

示例 4:

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

提示:

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

按照动规五部曲来分析:

1、确定dp数组以及下标的含义:dp[i][j] 表示从(0,0)出发,到dp[i][j] 有 dp[i][j] 条不同的路径

2、确定递推公式:根据题意,机器人每次只能向下或向右移动一步,可以看出:要想得到dp[i][j], 只能由两个方向推导出来,即 dp[i][j-1] 以及 dp[i-1][j-], dp[i][j] = dp[i][j-1] + dp[i-1][j];

3、dp数组的初始化: 由于从dp[0][0] 到 dp[i][0] 的路径只有一条,所以dp[i][0] = 0; dp[0][j] 同理,初始化代码如下:

for(int i = 0, i < m, i++) dp[i][0] = 1;
for(int j = 0, j < n, j++) dp[0][j] = 1;

4、确定遍历顺序:根据dp[i][j] = dp[i][j-1] + dp[i-1][j] 可得出遍历顺序是从左往右一层层遍历;

5、举例推导dp数组:

综合代码:

public static int uniquePaths(int m, int n) {// 创建一个二维数组dp,用于存储从起点到每个点的路径数量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;}// 从第二行第二列开始填充dp数组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)

代码随想录 (programmercarl.com)

动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II_哔哩哔哩_bilibili

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

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

看卡哥题解,动规五部曲:

1、确定dp数组以及下标的含义:

dp[i][j]表示从(0,0)出发,到(i,j) 有dp[i][j] 条不同的路径;

2、确定递推公式:

dp[i][j] = dp[i-1][j] + dp[i][j-1]; 注意:由于这个题中有了障碍,所以在遇到障碍的时候就需要保持初始状态为0的状态:

if(obstacleGrid[i][j] == 0){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];    
}

3、dp数组如何初始化:有障碍之后,障碍之后的位置应该初始化为0:

本题初始化代码:

注意代码里for循环的终止条件,一旦遇到obstacleGrid[i][0] == 1的情况就停止dp[i][0]的赋值1的操作,dp[0][j]同理:

 // 初始化第一列,如果遇到障碍物则停止初始化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;}

4、确定遍历顺序:

 // 从第二行第二列开始填充dp数组for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {// 如果当前格子有障碍物,则路径数量为0,否则等于左边格子的路径数量加上上方格子的路径数量dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;}}

5、举例推导dp数组:

综合代码:

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {// 获取矩阵的行数int m = obstacleGrid.length;// 获取矩阵的列数int n = obstacleGrid[0].length;// 创建一个二维数组dp,用于存储从起点到每个点的路径数量int[][] dp = new int[m][n];// 如果起点或终点有障碍物,直接返回0if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {return 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;}// 从第二行第二列开始填充dp数组for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {// 如果当前格子有障碍物,则路径数量为0,否则等于左边格子的路径数量加上上方格子的路径数量dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;}}// 返回最右下角格子的路径数量,即终点的路径数量return dp[m - 1][n - 1];}
}

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

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

相关文章

Codeforces Round 782 (Div. 2) D. Reverse Sort Sum

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

【WP】猿人学4 雪碧图、样式干扰

https://match.yuanrenxue.cn/match/4 探索 首先打开Fiddler&#xff0c;发现每个包的除了page参数一样&#xff0c;然后重放攻击可以实现&#xff0c;尝试py复现 Python可以正常拿到数据&#xff0c;这题不考请求&#xff0c;这题的难点原来在于数据的加密&#xff0c;这些数字…

用10个Kimichat提示词5分钟创建一门在线课程

●研究市场并在生成式AI主题内找到一个特定细分市场&#xff0c;这一市场尚未被现有课程充分覆盖。使用在线研究来收集关于当前可用课程类型的信息&#xff0c;以及市场上存在哪些空白。利用这些信息创建一个填补空白并吸引对“生成式AI”感兴趣的特定受众群体的课程。确定课程…

面试经典算法系列之二叉树17 -- 验证二叉树

面试经典算法32 - 验证二叉树 LeetCode.98 公众号&#xff1a;阿Q技术站 问题描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当…

ActiveMQ 如果数据处理出现异常会怎么样

我们有一个 Spring 的客户端&#xff0c;在处理消息的时候因为程序的原因出现消息处理异常。 对这种情况&#xff0c;ActiveMQ 会把出现异常的消息放在 DLQ 队列中进行持久化。 因此&#xff0c;在 ActiveMQ 消息处理队列中需要持续关注 DLQ 队列&#xff0c; DLQ 的队列都是无…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(5)——可控评估端到端评估

最后完结篇,文末有测试中发现的有趣现象,并附上了相关资料链接~ 5.可控评估 分两个阶段评估生成代理。我们从一个更加严格控制的评估开始,单独评估代理的响应,以了解它们是否在狭义上定义的上下文中产生可信的行为。然后,在我们对代理社区进行为期两天的端到端分析中,我…

蓝桥杯2024年第十五届省赛真题-数字接龙

思路&#xff1a;DFS&#xff0c;因为输入的i&#xff0c;j的顺序导致&#xff0c;方向向量中x是行编号&#xff0c;y是列编号。方向向量可能和直觉上不同。 错的 //int dx[8]{0,1,1,1,0,-1,-1,-1}; //int dy[8]{1,1,0,-1,-1,-1,0,1}; 对的 int dx[]{-1,-1,0,1,1,1,0,-1}; int…

数据结构(顺序栈

目录 1. 讲解&#xff1a;2. C代码实现&#xff1a;小结&#xff1a; 1. 讲解&#xff1a; 用顺序的物理结构&#xff08;数组&#xff09;存储栈这个数据结构&#xff0c;实现栈的创建、销毁、增删查、判空。 top指针的指向位置有两种实现方法&#xff1a;一个是指向栈顶元素…

页缓存(PageCache)和预读机制(readahead )

页缓存&#xff08;PageCache)和预读机制&#xff08;readahead &#xff09; 页缓存&#xff08;PageCache)是操作系统&#xff08;OS&#xff09;对文件的缓存&#xff0c;用于加速对文件的读写。 page 是内存管理分配的基本单位&#xff0c; Page Cache 由多个 page 构成&…

《Super Simple Skybox》天空盒 -- 创造绝美天空的神奇工具!限时免费!

《Super Simple Skybox》天空盒 -- 创造绝美天空的神奇工具&#xff01;限时免费&#xff01; 前言内容介绍资源特色动态&#xff0c;美丽的天空在几秒钟内即插即用 功能列表领取兑换码 前言 ^^在这个充满创意与想象的世界里&#xff0c;Unity 免费资源犹如一颗璀璨的明珠&…

react合成事件与原生事件区别备忘

朋友问起在做一个下拉框组件&#xff0c;下拉的点击事件是用react的onClick触发&#xff0c;外部区域点击关闭则用dom的原生点击事件绑定&#xff0c;问题是下拉的点击事件无法阻止冒泡到dom的原生事件。 我说&#xff0c;react的合成事件 和 原生事件是不一样的&#xff0c;尽…

三、fpga对完成过滤和校验的有效包数据进行有效像素提取、MATLAB对数据源进行处理与下发(完整实现pc机→显示器通信链路)

前言:上篇文章实现了MATLAB模拟发送UDP以太网协议数据包到fpga,能实现双沿数据→单沿数据转换,并将转换后的数据进行包过滤和crc校验,本篇内容要实现真正的从pc机下发视频数据,经过千兆以太网传输存储到fpga 的ddr3中,然后通过hdmi读出到显示屏上。 文章目录 一、模块设…

鸿蒙入门06-常见装饰器( 简单装饰器 )

装饰器是鸿蒙开发中非常重要的一个环节因为在很多地方我们都需要用到装饰器并且如果我们想高度的复用, 那么装饰器就是必不可少的一环接下来我们就来介绍一些常见的装饰器注意 : 所有装饰器首字母大写 Entry 用来装饰 struct 使用表示页面的入口 Component 装饰 struct, …

基于Springboot的论坛管理系统

基于SpringbootVue的论坛管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 公告 热门帖子 论坛新天地 新闻资讯 留言反馈 后台登录 用户管理 公告管理…

java宠物领养系统的设计与实现(springboot+mysql+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的宠物领养系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Spring Bo…

JavaWeb--04YApi,Vue-cli脚手架Node.js环境搭建,创建第一个Vue项目

04 1 Yapi2 Vue-cli脚手架Node.js环境搭建配置npm的全局安装路径 3 创建项目&#xff08;这个看下一篇文章吧&#xff09; 1 Yapi 前后端分离中的重要枢纽"接口文档",以下一款为Yapi的接口文档 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#…

Springboot引入外部jar包并打包jar包

前言 spring boot项目开发过程中难免需要引入外部jar包&#xff0c;下面将以idea为例说明操作步骤 将需要的jar包导入到项目中 2.在maven中引入jar包 <dependency><groupId>com</groupId><!--随便填的文件夹名称--><artifactId>xxx</artif…

linux内核初始化成功后是如何过渡到android初始化的

Android用的linux内核&#xff0c;以完成OS该有的功能&#xff0c;例如&#xff0c;文件系统&#xff0c;网络&#xff0c;内存管理&#xff0c;进程调度&#xff0c;驱动等 &#xff0c;向下管理硬件资源向上提供系统调用。另一些Android特有驱动也放在内核之中。 当linux内核…

【Qt】Qt安装包、源码、子模块(submodules)下载

1、Qt 4.0 ~ Qt5.14 Qt 4.0 ~ Qt5.14 离线安装包、源码和子模块(submodules)源码下载路径: https://download.qt.io/new_archive/qt/以Qt5.7.1为例,注意子模块都是源码,需要独立编译 2、Qt5.15 ~ Qt6.7 Qt5.15 ~ Qt6.7源码和子模块(submodules)源码下载路径: htt…

LabVIEW供热管道泄漏监测与定位

LabVIEW供热管道泄漏监测与定位 在现代城市的基础设施建设中&#xff0c;供热管道系统起着极其重要的作用。然而&#xff0c;管道泄漏问题不仅导致巨大的经济损失&#xff0c;还对公共安全构成威胁。因此&#xff0c;开发一种高效、准确的管道泄漏监测与定位技术显得尤为关键。…