代码随想录第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…

Rust常见陷阱 | 线程间传递消息导致主线程无法结束

在多线程编程中,线程之间的通信是一个不可或缺的话题。尤其是在Rust语言中,由于其特有的所有权机制,线程通信需要更加仔细地处理。本文将深入讨论使用Rust标准库中的消息通道时如何避免主线程被阻塞的问题,并提供详尽的代码示例来辅助理解。 问题描述 当我们在Rust中使用…

【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; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当…

云解析DNS是什么?

说起云解析&#xff0c;相信很多用户都比较陌生&#xff0c;对于刚刚接触互联网的小白并不了解什么是云解析DNS&#xff0c;下面为您详解一下以上问题。 云解析DNS是什么 云解析 DNS(Domain Name System&#xff0c;简称 DNS) 一种安全、快速、稳定、可靠的权威 DNS 解析管理…

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…

笔记:编写函数f(n),实现输人n的值,求出n的阶乘,然后调用此函数计算1!+2!+ 3!+...10!的结果,输出到屏幕上。

文章目录 前言一、n的阶乘是什么&#xff1f;二、编写代码1.代码2.优化代码 总结 前言 题目&#xff1a;编写函数f(n),实现输人n的值&#xff0c;求出n的阶乘&#xff0c;然后调用此函数计算1&#xff01;2! 3!…10!的结果&#xff0c;输出到屏幕上。 在编写函数 f(n) 前&…

Oracle昨日复习以及注意事项(与MYSQL不同的点)

一、SQL语句复习 1、创建表空间 表空间&#xff0c;指定存储文件的位置&#xff0c; 再去创建用户 &#xff0c;再指定表空间 创建表 数据库 &#x1f447; 表空间 创建表空间 create table space 表空间名字 datafile 路径&#xff08;保存数据路径&#xff09; size 100m a…

数据结构(顺序栈

目录 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 构成&…

LeetCode题练习与总结:爬楼梯--70

一、题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 …

《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读出到显示屏上。 文章目录 一、模块设…

【Qt学习笔记】connect函数的使用方法总结

connect函数的使用方法总结 一&#xff0c;简介二&#xff0c;connect函数的标准格式&#xff1a;三&#xff0c;参数的含义四&#xff0c;示例五&#xff0c;注意 一&#xff0c;简介 在Qt框架中&#xff0c;connect函数用于连接信号和槽&#xff0c;是Qt信号和槽机制的核心。…

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

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

linux二元比较操作符

Linux中如果要比较两个变量或数字&#xff0c;常用二元比较操作符&#xff1b;对于整数之间的比较或字符串之间的比较会有所区别&#xff0c;梳理如下&#xff0c;供大家参考使用&#xff1a; 1.整数比较 二元比较操作符说明备注-eq等于if [ "$a" -eq "$b&quo…