【面试题 08.02. 迷路的机器人】


  设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。

  网格中的障碍物和空位置分别用 1 和 0 来表示。
  返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。如果没有可行的路径,返回空数组。
示例1:

输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: [[0,0],[0,1],[0,2],[1,2],[2,2]]
解释:
输入中标粗的位置即为输出表示的路径,即
0行0列(左上角) -> 0行1列 -> 0行2列 -> 1行2列 -> 2行2列(右下角)

说明: r 和 c 的值均不超过 100。


题意:
  一个机器人需要从一个二维矩阵的左上角走到右下角,每次只能往右或往下走,其中有障碍物(障碍物处不可通行),输出任意一条可行的路径。
思路:
  首先想到的就是用动态规划的思想来做这道题,分析如下:
(1)定义:dp[i][j]表示机器人是否能走到(i,j)位置。
(2)初始化:  
     ① dp[0][0]=1;
     ②计算首行和首列: 判断左边或者上面是否为true且当前是否有障碍;
     ③其他为false;
(3)计算:
     ①obstacleGrid[i][j] = 1的情况:dp[i][j] = 0;
     ②obstacleGrid[i][j] = 0的情况:dp[i][j] = max(d[i-1][j], d[i][j-1]) 取两种情况(左和上)的最大值。
(4)结果
     ①dp[r-1][c-1]=0:没有路径
     ②dp[r-1][c-1]=1:倒推回去求任意一条路径,无需判断最短,只要一条可以一直走下去的路径就可以。因为插入路径是倒序,最后倒序后就是结果。


代码:

class Solution {public:vector<vector<int>> pathWithObstacles(vector<vector<int>>& obstacleGrid) {vector<vector<int>>ans;int row = obstacleGrid.size(); //矩阵的行int col = obstacleGrid[0].size();//矩阵的列if(row ==0||col ==0)return ans;//起点或终点是障碍的情况if(obstacleGrid[0][0]==1||obstacleGrid[row-1][col-1]==1)return ans;int dp[row+1][col+1];dp[0][0]=1;//处理第一列for(int i=1;i<row;i++){if(obstacleGrid[i][0]==1){dp[i][0]=0;}else{dp[i][0]=dp[i-1][0];}}//处理第一行for(int i=1;i<col;i++){if(obstacleGrid[0][i]==1)dp[0][i] = 0;else dp[0][i] = dp[0][i-1];}//计算状态转移方程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] = max(dp[i-1][j],dp[i][j-1]);}}//走到终点的状态是0,无路径if(dp[row-1][col-1] == 0) return ans;int r=row-1,c=col-1;//从终点往回走,随意找一条可行路径  while(r!=0 || c!=0){ans.push_back({r,c});int up=0;if(r>0)up=dp[r-1][c];int left=0;if(c>0)left=dp[r][c-1];if(up>=left)r--;else c--;}//把起点加进去ans.push_back({0,0});//翻转结果reverse(ans.begin(),ans.end());return ans;}
};

时间复杂度: O(row*col)
空间复杂度: O(row+col)

[Leetcode] 面试题 08.02. 迷路的机器人相关推荐

  1. Leetcode每日一题:面试题 08.02. 迷路的机器人

    思路:深度优先搜索:设立一个全局变量flag,一旦找到终点,便将flag置为true,防止其进一步寻求多条路径: 加visited时,很多人选择new一个二维数组出来,然而这里我们只需将已被试过无法到 ...

  2. 程序员面试金典 - 面试题 08.02. 迷路的机器人(DFS/动态规划)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 动态规划 1. 题目 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列. 机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍 ...

  3. 面试题 08.02. 迷路的机器人

    设想有个机器人坐在一个网格的左上角,网格 r 行 c 列.机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物).设计一种算法,寻找机器人从左上角移动到右下角的路径. 来源:力扣(LeetC ...

  4. Leetcode 面试题 08.01. 三步问题

    Leetcode 面试题 08.01. 三步问题 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/three-steps ...

  5. LeetCode 面试题 10.02. 变位词组

    面试题 10.02. 变位词组 Ideas 互为变位词的两个字符串包含的字符相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,可以将排序之后的字符串作为哈希表的键. 在Python里面有 ...

  6. LeetCode 面试题 08.01. 三步问题 (动态规划)

    面试题 08.01. 三步问题 解法1(动态规划) 分析出递推式:f(n) = f(n - 1) + f(n - 2) + f(n - 3) class Solution {public int wa ...

  7. LeetCode 面试题 08.11. 硬币 多种解法 完全背包问题

    面试题 08.11. 硬币   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部 ...

  8. LeetCode —— 面试题 08.12. 八皇后(Python)

    设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的"对角线"指的是所有的对角线,不只是平分整个棋盘的那两条对角线. ...

  9. Leetcode —— 面试题 04.02. 最小高度树(Python)

    给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树. 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null ...

最新文章

  1. Java笔记:成员变量,局部变量,类变量,实例变量以及注意事项
  2. 160921、React入门教程第一课--从零开始构建项目
  3. 【转载】SAP集成会计凭证生成的原理
  4. YUV422转RGB24
  5. MySQL数据库开发的 36 条军规
  6. 质量属性效用树例子_数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇
  7. centos7 python3.7 ssl_centos 解决python3.7 安装时No module named _ssl
  8. Redis学习总结(13)——分布式之数据库和缓存双写一致性方案解析!
  9. oracle-day1
  10. 返回两个时间范围内的一个随机时间
  11. 100兆的网速在电脑上怎样测试软件,怎么测网速多少兆,360测网速
  12. 海明贴近度matlab,Matlab学习系列23.-模糊聚类分析原理及实现.docx
  13. while 循环导致 IndentationError: unexpected unindent错误
  14. typora 修改块代码 和 代码块的背景色
  15. 安全专业委员会发言_企业安全委员会发言
  16. 关于闲鱼测试数据构造,我有几条心得
  17. org.apache.kafka.clients.consumer.CommitFailedException
  18. 读书笔记 之《软件架构设计: 大型网站技术架构与业务架构融合之道》
  19. 多段线简化算法,看这一篇就够了
  20. [AHK]输入法状态提示,中文状态提示“中”,英文状态提示“EN”[转]

热门文章

  1. [Machine Learning]Markov chain and Hidden Markov Models(HMMs)
  2. #Android笔记# 超级足球app 开发总结(三)—— CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout实现两种折叠效果
  3. 【老叶茶馆】MySQL复制中slave延迟监控
  4. 李宏毅ML lecture-10 CNN
  5. 【opencv学习之四十六】OpenCV4.2 QR二维码识别及定位
  6. 长沙SEO优化:SEO优化关键词如何进行研究和分析以及网站不同阶段的SEO优化排名策略
  7. 如何把网站加入百度、google、Yahoo搜索、一搜、搜狗、中搜、爱问等搜索引擎.
  8. 改变背景颜色 darkenBackground
  9. Redis的数据删除策略
  10. 英语计算机编程员面试对话文章,英语面试对白