Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang刷leetcode:到达角落需要移除障碍物的最小数目

golang刷leetcode:到达角落需要移除障碍物的最小数目

作者头像
golangLeetcode
发布于 2022-08-02 11:47:49
发布于 2022-08-02 11:47:49
35200
代码可运行
举报
运行总次数:0
代码可运行

给你一个下标从 0 开始的二维整数数组 grid ,数组大小为 m x n 。每个单元格都是两个值之一:

0 表示一个 空 单元格,

1 表示一个可以移除的 障碍物 。

你可以向上、下、左、右移动,从一个空单元格移动到另一个空单元格。

现在你需要从左上角 (0, 0) 移动到右下角 (m - 1, n - 1) ,返回需要移除的障碍物的 最小 数目。

示例 1:

输入:grid = [[0,1,1],[1,1,0],[1,1,0]]

输出:2

解释:可以移除位于 (0, 1) 和 (0, 2) 的障碍物来创建从 (0, 0) 到 (2, 2) 的路径。

可以证明我们至少需要移除两个障碍物,所以返回 2 。

注意,可能存在其他方式来移除 2 个障碍物,创建出可行的路径。

示例 2:

输入:grid = [[0,1,0,0,0],[0,1,0,1,0],[0,0,0,1,0]]

输出:0

解释:不移除任何障碍物就能从 (0, 0) 到 (2, 4) ,所以返回 0 。

提示:

m == grid.length

n == grid[i].length

1 <= m, n <= 105

2 <= m * n <= 105

grid[i][j] 为 0 或 1

grid[0][0] == grid[m - 1][n - 1] == 0

解题思路:

1,由于本题有后效性,从上下左右四个方向都可以到达某个节点,所以无法使用动态规划

2,本题其实是起点到终点的最短路径问题,位置为0的地方我们认为路径的最大代价是0,有障碍物的地方代价是1

3,是一个简化版本的dijstra算法

A,我们到达任意节点最多m*n步,可以作为最大路径长度初始化我们的图

B,从起始点出发,我们将距离为0的点的距离该为0,为1的点的距离改成1

C,优先从距离最短的点往周围扩算,即距离为0的点,如果没有距离为0的点,我们可以考虑距离为1的点

D,维护优先队列太麻烦了,本题可以简化成两个数组,数组0是通过距离为0的路径到达的,数组1是经过距离为1的点到达的,每到达一个点加入到对应数组末尾。

E,两个数组一定是递增的

F,所以我们优先取距离最小的,也就是从数组0开始取,由于数组0具有特殊性,都是0,从数组头还是尾取都是一样的,但是数组1,必须从头取

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

func minimumObstacles(grid [][]int) (ans int) {
   m,n:=len(grid),len(grid[0])
   path:=make([][]int,m)
   for i:=0;i<m;i++{
       path[i]=make([]int,n)
       for j:=0;j<n;j++{
           path[i][j]=m*n
       }
   }
   path[0][0]=0
  
  dir:=[]pos{{-1,0},{1,0},{0,-1},{0,1}}

   var q0,q1 []pos
   q0=append(q0,pos{})
   for len(q0)>0 ||len(q1)>0{
       var p pos
       if len(q0)>0{
          p=q0[len(q0)-1]
          q0=q0[:len(q0)-1]
       }else{
          p=q1[0]
          q1=q1[1:]
       }
       for _,d:=range dir{
            p1:=pos{}
           p1.x=p.x+d.x
           p1.y=p.y+d.y
           if p1.x>=0&&p1.x<m && p1.y>=0&&p1.y<n{
               if grid[p1.x][p1.y]==1{
                    if path[p1.x][p1.y]>path[p.x][p.y]+1{
                        path[p1.x][p1.y]=path[p.x][p.y]+1
                         q1=append(q1,p1)
                    }
               }else{
                    if path[p1.x][p1.y]>path[p.x][p.y]{
                        path[p1.x][p1.y]=path[p.x][p.y]
                        q0=append(q0,p1)
                    }
               }
           }
       }
   }
   return path[m-1][n-1]
}

type pos struct {
    x,y int
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度解析之算法之多源BFS
多源BFS:用BFS解决边权为1的多源最短路问题 解法一:暴力,将多源最短路问题转换为若干个单源最短路问题,但是肯定是会出现超时现象的 解法二:把所有的源点当成一个超级源点,问题就变成了单体的单源最短路问题了
Undoom
2025/07/24
560
深度解析之算法之多源BFS
​LeetCode刷题实战79:单词搜索
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/20
5830
​LeetCode刷题实战79:单词搜索
2025-04-09:第 K 近障碍物查询。用go语言,我们有一个无限大的二维平面。给定一个正整数 k 和一个二维数组 quer
2025-04-09:第 K 近障碍物查询。用go语言,我们有一个无限大的二维平面。给定一个正整数 k 和一个二维数组 queries,每个元素 queries[i] = [x, y] 表示在平面上的坐标 (x, y) 处建立一个障碍物。系统保证在之前的查询中不会在同一坐标位置再建立障碍物。
福大大架构师每日一题
2025/04/09
790
2025-04-09:第 K 近障碍物查询。用go语言,我们有一个无限大的二维平面。给定一个正整数 k 和一个二维数组 quer
LeetCode周赛295,赛后看了大佬的代码,受益良多……
这一场比赛的赞助商是博乐科技,前1000名都可以获得内推机会。和之前50名、100名获得内推的场次比起来有诚意多了。
TechFlow-承志
2022/09/21
4490
LeetCode周赛295,赛后看了大佬的代码,受益良多……
漫画:BAT必考题目 (不同路径 - 障碍物版本)
不同路径:一个机器人位于一个 m x n 网格的左上角,起始点在下图中标记为“Start”。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,在下图中标记为“Finish”。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
程序员小浩
2020/03/30
7040
漫画:BAT必考题目 (不同路径 - 障碍物版本)
LeetCode 1293. 网格中的最短路径(DP/BFS)
给你一个 m * n 的网格,其中每个单元格不是 0(空)就是 1(障碍物)。 每一步,您都可以在空白单元格中上、下、左、右移动。
Michael阿明
2020/07/13
1.9K0
华为0920秋招笔试真题解析
在PCB印刷电路板设计中,器件之间的连线,要避免线路的阻抗值增大,而且器件之间还有别的器任和别的干扰源,在布线时我们希望受到的干扰尽量小。
五分钟学算法
2023/09/24
5390
华为0920秋招笔试真题解析
LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)
我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格。 蛇会从左上角((0, 0) 和 (0, 1))开始移动。 我们用 0 表示空单元格,用 1 表示障碍物。 蛇需要移动到迷宫的右下角((n-1, n-2) 和 (n-1, n-1))。
Michael阿明
2021/02/19
6880
Leetcode 第 167 场周赛题解
Rank 13/1477 5283. 二进制链表转整数 题意:给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。 难度:easy 数据范围: 链表不为空。 链表的结点总数不超过 30。 每个结点的值不是 0 就是 1。 思路:把所有元素放在一个vector里面,然后反转一下从前往后计算即可。 复杂度:O(30) 代码: class Solution { public: int getDecima
BBuf
2019/12/24
4210
【LeetCode】动态规划 刷题训练(二)
只能向下或者向右走,而且不能回退 所以从start到 finish ,共有三种情况
lovevivi
2023/10/17
2630
【LeetCode】动态规划 刷题训练(二)
LeetCode 317. 离建筑物最近的距离(逆向BFS)*
你是个房地产开发商,想要选择一片空地 建一栋大楼。 你想把这栋大楼够造在一个距离周边设施都比较方便的地方,通过调研,你希望从它出发能在 最短的距离和 内抵达周边全部的建筑物。 请你计算出这个最佳的选址到周边全部建筑物的 最短距离和。
Michael阿明
2021/02/19
1.4K0
2024-12-31:物块放置查询。用go语言,在一个无限延伸的数轴上,原点位于 0 处,沿着 x 轴向正方向无限延伸。 现在我
2024-12-31:物块放置查询。用go语言,在一个无限延伸的数轴上,原点位于 0 处,沿着 x 轴向正方向无限延伸。
福大大架构师每日一题
2025/01/01
850
2024-12-31:物块放置查询。用go语言,在一个无限延伸的数轴上,原点位于 0 处,沿着 x 轴向正方向无限延伸。 现在我
2025-04-10:选择矩阵中单元格的最大得分。用go语言,给你一个由正整数构成的二维矩阵 grid。 你的任务是从这个矩阵中
2025-04-10:选择矩阵中单元格的最大得分。用go语言,给你一个由正整数构成的二维矩阵 grid。
福大大架构师每日一题
2025/04/10
1130
2025-04-10:选择矩阵中单元格的最大得分。用go语言,给你一个由正整数构成的二维矩阵 grid。 你的任务是从这个矩阵中
2025-04-17:穿越网格图的安全路径。用go语言,给定一个大小为 m 行 n 列的二维二进制数组 grid,以及一个初始健
2025-04-17:穿越网格图的安全路径。用go语言,给定一个大小为 m 行 n 列的二维二进制数组 grid,以及一个初始健康值 health。
福大大架构师每日一题
2025/04/18
760
2025-04-17:穿越网格图的安全路径。用go语言,给定一个大小为 m 行 n 列的二维二进制数组 grid,以及一个初始健
LeetCode 5270. 网格中的最小路径代价(动态规划)
给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 m * n - 1 的不同整数组成。 你可以在此矩阵中,从一个单元格移动到 下一行 的任何其他单元格。如果你位于单元格 (x, y) ,且满足 x < m - 1 ,你可以移动到 (x + 1, 0), (x + 1, 1), ..., (x + 1, n - 1) 中的任何一个单元格。注意: 在最后一行中的单元格不能触发移动。
Michael阿明
2022/06/13
6220
LeetCode 5270. 网格中的最小路径代价(动态规划)
吸附设计:学会正确地贴贴
本文将介绍图形编辑器中吸附系统中,各种吸附类型的吸附逻辑和算法实现,让大家对吸附有一个概念。
前端西瓜哥
2024/07/12
3050
吸附设计:学会正确地贴贴
leetcode刷题(130)——最大得分的路径数目
你的目标是到达数组最左上角的字符 ‘E’ ,数组剩余的部分为数字字符 1, 2, …, 9 或者障碍 ‘X’。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。
老马的编程之旅
2022/11/18
2500
leetcode刷题(130)——最大得分的路径数目
LeetCode 994. 腐烂的橘子(图的BFS)
值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
Michael阿明
2020/07/13
4140
LeetCode 994. 腐烂的橘子(图的BFS)
【算法学习】递归、搜索与回溯算法(二)
https://blog.csdn.net/2301_80220607/category_12922080.html?spm=1001.2014.3001.5482
GG Bond1
2025/05/09
1100
【算法学习】递归、搜索与回溯算法(二)
《连连看》算法c语言演示(自动连连看)
(图片是游戏的示意图,来自互联网,与本文程序无关) 看题目就知道是写给初学者的,没需要的就别看了,自己都觉得怪无聊的。 很多游戏的耐玩性都来自精巧的算法,特别是人工智能的水平。比如前几天看了著名的Alpha GO的算法,用了复杂的人工智能网络。而最简单的,可能就是连连看了,所以很多老师留作业,直接就是实现连连看。 连连看游戏的规则非常简单: 两个图片相同。 两个图片之间,沿着相邻的格子画线,中间不能有障碍物。 画线中间最多允许2个转折。 所以算法主要是这样几部分: 用数据结构描述图板。很简单,一个2
俺踏月色而来
2018/06/21
3.3K0
推荐阅读
相关推荐
深度解析之算法之多源BFS
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验