力扣刷题 63.不同路径 II

embedded/2024/10/22 10:38:15/

题干

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

解题思路

这道题目我一开始被误导了,以为不用自己创建棋盘,只用题目给出的棋盘就可以了,但是很明显这不可行,因为障碍物的坐标的值应该为0而不是1,0意味着没有路径可以到达障碍物。

事实上,我们可以把题目给的棋盘当作地图,上面标记了障碍物的位置,这样也不需要在自己的棋盘上标记障碍物了,只要对照着地图看就行了,是不是很妙。

1.首先确定dp数组的含义

dp[i][j]为到[i][j]点的路径总和

2.确定递推公式

if(obstacleGrid[i][j] == 1)

       continue;

dp[i][j] = dp[i-1][j] + dp[i][j-1];

如果遇到障碍物直接跳过,保留值为0

3.dp数组的初始化

这一次我们用卡尔的办法来初始化。

第一行障碍物前的全为1,第一列障碍物前的全为1

 

4.确定递推顺序

从递推公式可以看出,状态由左边和上边的状态推到而来,用从左至右,从上至下的两层循环即可

5.举例推导dp数组

3*6的棋盘的数组的结果应该如下 

完整代码如下

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {//获取行的个数int m =  obstacleGrid.size();//获取列的个数int n = obstacleGrid[0].size();//剪枝:如果起点和终点都有障碍物,return 0if(obstacleGrid[0][0] == 1|| obstacleGrid[m-1][n-1] == 1)return 0;//建立全为0的棋盘vector<vector<int>> dp(m, vector<int>(n, 0));//想要找到障碍物的位置比较麻烦,不如全部初始化为0,遇到障碍物保持0//初始化 拿着地图看,第一行障碍物前的全为1for(int i = 0; i < m && obstacleGrid[i][0] == 0; i++){dp[i][0] = 1;}//初始化 拿着地图看,第一列障碍物前的全为1for(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];}
};

 ps:用变量来建立静态数组是不行的,所以要创建动态的二维数组

vector<vector<int>> dp(m, vector<int>(n, 0));

 格式:vector<vector<int> >swp(n,vector<int>(m));//定义二维数组swp[][],n行 m列 


http://www.ppmy.cn/embedded/26881.html

相关文章

【网络原理】网络层IP协议 | IP报文格式 | IP地址 | 地址管理 | 路由选择

文章目录 网络层一、IP协议1.IP协议报文格式2.地址管理IP地址不够用的解决方法&#xff1a;1.动态分配IP&#xff1a;过渡方案&#xff0c;目前仍广泛存在。2.NAT机制&#xff08;网络地址转换&#xff09;1.内网IP(局域网IP)2.外网IP(广域网IP) 3.IPv64.网段划分5.子网掩码6.特…

GoLang Gin实际使用

所有代码同步到Admin/gitDemo - Gitee.comhttps://gitee.com/mec-deployment-team_0/git-demo/tree/dev/ 1.创建Gin框架 一般设计一个常规的web项目&#xff0c;都需要以下几个模块 runApp 主函数&#xff0c;运行整个项目routes 路由控制&#xff0c;管理跳转以及路由分组co…

Stm32CubeMX 为 stm32mp135d 添加网卡 eth

Stm32CubeMX 为 stm32mp135d 添加网卡 eth 一、启用设备1. eth 设备添加2. eth 引脚配置2. eth 时钟配置 二、 生成代码1. optee 配置2. uboot 配置3. linux 配置 bringup 可参考&#xff1a;Stm32CubeMX 生成设备树 一、启用设备 1. eth 设备添加 我这里只启用一个eth设备&…

GPT3 探索指南(三)

原文&#xff1a;zh.annas-archive.org/md5/e19ec4b9c1d08c12abd2983dace7ff20 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第九章&#xff1a;构建一个由 GPT-3 提供动力的问答 app 到目前为止&#xff0c;我们已经查看了&#xff08;并编写了&#xff09;很多代…

【Linux系统化学习】生产者消费者模型(阻塞队列和环形队列)

目录 生产者消费者模型 什么是生产者消费者模型 为什么要使用生产者消费者模型 生产者消费者模型的优点 为什么生产者和生产者要互斥&#xff1f; 为什么消费者和消费者要互斥&#xff1f; 为什么生产者和消费者既是互斥又是同步&#xff1f; 基于BlockingQueue的生产者…

纯血鸿蒙APP实战开发——发布图片评论

介绍 本示例将通过发布图片评论场景&#xff0c;介绍如何使用startAbilityForResult接口拉起相机拍照&#xff0c;并获取相机返回的数据。 效果图预览 使用说明 通过startAbilityForResult接口拉起相机&#xff0c;拍照后获取图片地址。 实现思路 创建CommentData类&#…

vue3 引用虚拟键盘simple-keyboard

simple-keyboard官网地址&#xff1a;https://virtual-keyboard.js.org 目前实现效果图是&#xff08;实现数字、大小写字母键盘&#xff09;&#xff1a; 1.需要先安装simple-keyboard npm install simple-keyboard --save2.封装sinpleKeyboard 组件 <!-- keyboard-bo…

pytorch中创建maskrcnn模型

0.模型输入/输出参数参见 链接: pytorch的mask-rcnn的模型参数解释 核心代码 GeneralizedRCNN(这里以mask-rcnn来解释说明) # 通过输入图像获取fpn特征图,注意这里的backbone不是直接的resnet,而是fpn化后的 features self.backbone(images.tensors) # 由于是mask-rcnn,故而…