63. Unique Paths II

2023-11-13

  • 思路1

这个题目第一个思路还是用DFS,和第62题一样,但是在递归的时候需要判断有无障碍物。因为第62题用的DFS,Leetcode提示Time Limit Exceeded,所以这道题没有尝试DFS的做法,而是直接使用了DP。

  • 思路2

根据第62题可以得到状态转移方程为dp[i][j] = dp[i - 1][j] + dp[i][j - 1],其中dp[i][j] 表示到当前位置不同的走法的个数。在本题中,状态转移方程因为障碍物的存在略有变化。另外由于障碍物的存在,数组的初始化也有一些不同。

先看第一种情况,障碍物在边上的情况:
1327401-20190928085116686-2143835507.png

障碍物后面的dp[][]都应该被初始化为0,因为机器人只能向左走或向右走,而在边上的这种情况,机器人没有办法走到。

障碍物在中间:
1327401-20190928085553671-1210789616.png

在这种情况下,受到障碍物影响的是障碍物左边的1号和障碍物下边的2号,1号由于障碍物的影响,只能从上往下走,所以可以走到1号的不同走法的个数是1号上方的小格子决定的。2号受到障碍物的影响,只能从2号的左边走到,因此走到2号的不同走法的个数是由2号左边的小格子决定的。

因此状态转移方程如下:

dp[i][j] = dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; dp[i][j]的左边和上边都没有障碍物的情况。
dp[i][j] = dp[i][j - 1]; dp[i][j]的左边有障碍物的情况
dp[i][j] = dp[i - 1][j]; dp[i][j]的上面有障碍物的情况。

C++代码实现如下:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) 
    {
        //维护一个二维数组
        double row = obstacleGrid.size();
        double col = obstacleGrid.at(0).size();

        vector<vector<double>> dp(row, vector<double>(col));
        //初始化dp数组
        for (int i = 0;i < 1;i++)
        {
            for (int j = 0;j < col;j++)
            {
                if (obstacleGrid[i][j] == 0)
                {
                    dp[i][j] = 1;
                }
                else if (obstacleGrid[i][j] == 1)
                {
                    dp[i][j] = 0;
                    for (;j < col;j++)
                    {
                        dp[i][j] = 0;
                    }
                }
            }
        }
        for (int j = 0; j < 1; j++)
        {
            for (int i = 0; i < row; i++)
            {
                if (obstacleGrid[i][j] == 0)
                {
                    dp[i][j] = 1;
                }
                else if (obstacleGrid[i][j] == 1)
                {
                    dp[i][j] = 0;
                    for (; i < row; i++)
                    {
                        dp[i][j] = 0;
                    }
                }
            }
        }
        for (int i = 1;i < row;i++)
        {
            for (int j = 1;j < col;j++)
            {
                if (obstacleGrid[i][j] == 1)
                {
                    dp[i][j] = 0;
                }
                else
                {
                    dp[i][j] = 1;
                }
            }
        }
        //根据状态方程和障碍物判断路径
        for (int i = 1;i < row;i++)
        {
            for (int j = 1;j < col;j++)
            {                   
                if (dp[i][j] == 0)
                {
                    continue;
                }
                else
                {
                    if (dp[i-1][j] == 0)
                    {
                        dp[i][j] = dp[i][j - 1];
                    }
                    else if (dp[i][j - 1] == 0)
                    {
                        dp[i][j] = dp[i - 1][j];
                    }
                    else
                    {
                        dp[i][j] = dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                    }
                }
            }
        }
        return dp[row - 1][col - 1];
    }
};

转载于:https://www.cnblogs.com/Manual-Linux/p/11601437.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

63. Unique Paths II 的相关文章

  • 列表list转树形结构(python/golang/js/php)

    文章目录 1 原数据 2 利用对象内存共享生成嵌套结构 2 1 算法原理 2 2 算法实现 2 2 1 JS 2 2 2 Python 2 2 3 go 2 2 4 php 2 3 运行结果 3 递归 3 1 算法实现 3 1 1 pyth

随机推荐

  • 基于协同过滤算法的书籍推荐 毕业设计-附源码101555

    摘 要 21世纪的今天 随着社会的不断发展与进步 人们对于信息科学化的认识 已由低层次向高层次发展 由原来的感性认识向理性认识提高 管理工作的重要性已逐渐被人们所认识 科学化的管理 使信息存储达到准确 快速 完善 并能提高工作管理效率 促进
  • 微服务restful风格,用Post在服务之间发送请求接收不到参数接收不到问题(@RequestParam和@RequestBody)

    上代码 发送端 接收端 问题 发送端可以接受从前段传过来的数据 但是请求接收端时 接收端可以接收url请求 但是参数传不到接收端 分析 用get和post传输的数据是截然不同的 用get是追加在url之后 直接放在请求头 但是post请求的
  • 体验css:repeat和grid

    文章目录 一 repeat 1 语法 2 auto fill和auto fit 3 专属尺寸 fr auto max content min content 二 grid 1 设置grid布局 2 设置列宽行高 3 设置间距 4 设置分区
  • 【C++实现】 数据库连接池

    文章目录 涉及知识 为什么要弄连接池 功能介绍 成员变量讲解 代码剖析 Connection h Connection cpp ConnectionPool h ConnectionPool cpp 性能测试 难点 总结 涉及知识 MySQ
  • 解一元二次方程——Java

    解一元二次方程 可以使用下面的公式求元二次方程ax x bx c 0的两个根 b b 4ac称作一元二次方程的判别式 如果它是正值 那么一元二次方程就有两个实数根 如果它为0 方程式就只有一个根 如果它是负值 方程式无实数根 编写程序 提示
  • js中使用websocket

    后端地址是http的 websocket地址 ws开头 后端地址是https的 websocket地址wss开头 对于websocket没有跨域的问题 import MessageBox from element ui let url ws
  • Linux学习笔记--8(文件权限)

    文件权限与归属 Linux不同的字符来区分文件类型 常见如下 普通文件 d 目录文件 l 链接文件 b 块设备文件 c 字符设备文件 p 管道文件 对应目录文件 可读 表示能够读取目录内的文件列表 可写 表示能够在目录内新增 删除 重命名文
  • Oracle : ORA-02290: 违反检查约束条件

    背景 一个oracle表 有个字段开始被设置不为空 后来我想测试 把这个不为空 去掉了 然后保存 就报错 om dtwave meteor connector common exception ConnectorException Writ
  • 感知机原始形式、对偶形式的Python实现

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 感知机学习的目标就是求得一个能够将训练数据集中正负实例完全分开的分类超平面 感知机原始形式 from future import division import rando
  • Rabbitmq延迟队列实现定时任务

    场景 开发中经常需要用到定时任务 对于商城来说 定时任务尤其多 比如优惠券定时过期 订单定时关闭 微信支付2小时未支付关闭订单等等 都需要用到定时任务 但是定时任务本身有一个问题 一般来说我们都是通过定时轮询查询数据库来判断是否有任务需要执
  • 多态数组的简单代码教学

    多态数组的简单代码教学 package com hspedu polrArr public class PloyArray public static void main String args Person persons new Per
  • 基于github搭建自已的个人博客

    昨天搭建了基于github 的个人博客 在此记录搭建过程 1 环境准备 1 1 git 1 2 nodejs 1 3 hexo 1 安装命令 npm install hexo g 2 测试是否安装成功 hexo v 3 安装hexo依赖 n
  • vue 虚拟dom转换真实dom源码解析

    当不断的通过JS修改DOM时 不经意间会触发到渲染引擎的回流或者重绘 这个性能开销是非常巨大的 因此为了降低开销 我们需要做的是尽可能减少DOM操作 当我们想用JS脚本大批量进行DOM操作时 会优先作用于Virtual DOM这个JS对象
  • TCP和UDP相关问题

    目录 一 网络基础 1 OSI 七层模型划分为以下七层 不实用 2 TCP IP五层 或四层 模型 二 UDP与TCP的区别 三 如何基于UDP协议实现可靠传输 实际想说的是TCP 四 什么场景中适合使用TCP和UDP 一 网络基础 1 O
  • java web系统设计思路_JavaWeb——实战入门,设计思路总结。

    期末考试炸掉了 关于此次期末考试题 我一言难尽 过后总结 还是应该加强功底 勤能补拙 做一篇入门的设计思路总结 巩固一下基础 如讲解有误 请多多包涵 我的设计思路如下 1 在navicat mysql可视化 上建立数据库 gt 建立数据表
  • 实现计算机视觉——人脸检测

    概述 计算视觉是人工智能的一部分 旨在设计能够像人类视觉一样进行观察的智能算法 在本文中 我们将介绍三个主要范围 人脸检测 物体检测 面部识别 对象跟踪 在第一篇文章中 我们将重点介绍计算机视觉 以及基于 Python OpenCV 库的人
  • mybatis-plus 新增/修改实现自动填充指定字段

    需要修改的字段在模型类上添加 TableField fill FieldFill xxx 注解 FieldFill的选项 哪个字段在什么时候填充需要手动设置注解 新建一个MetaObjectHandler的实现类MyMetaObjectHa
  • spyder debug

    按钮作用 1 debug file 进入调试 2 run current line 运行当前行 3 step into function or method of current line 进入函数或方法内运行 4 run until cu
  • 节点对于ip的重要性

    网络节点是选择代理IP的主要标准 那么 你知道节点对代理IP质量有什么影响吗 神龙IP为你解答 浅析节点对代理IP的影响 1 代理IP的节点越多 重复率越低 全球IPv4网络非常有限 国内IPv4网络也是如此 各地区IPv4网络更加有限 代
  • 63. Unique Paths II

    思路1 这个题目第一个思路还是用DFS 和第62题一样 但是在递归的时候需要判断有无障碍物 因为第62题用的DFS Leetcode提示Time Limit Exceeded 所以这道题没有尝试DFS的做法 而是直接使用了DP 思路2 根据